2013-10-27 40 views
2

我每100K值需要被在給定的時間計算訪問,即使largeHeap要求的幾個大雙和長數組了Android OS犯規給了我足夠的內存和我不斷收到大部分測試設備的內存溢出的異常。所以我去研究各種方法來解決這個問題,並根據答案我從Waldheinz我previous question我實現了一個基於文件的數組了,使用RandomAccessMemory得到一個通道,然後將其使用MappedByteBuffer映射的建議,並使用MappedByteBuffer asLongBuffer或asDoubleBuffer。這工作完美,我100%消除了outofmemory異常。但表現很差。我得到很多的電話來獲得(部分指標)的拍攝每一個,因此用戶的先進經驗是毀了約5-15毫秒如何提高MappedByteBuffer獲得我的用例性能?

一些有用的信息:

  1. 我使用陣列上的二進制搜索找到開始和結束索引,然後我從開始的線性循環結束
  2. 我增加了打印命令的任何get()方法調用,需要更多然後5毫秒完成(打印出時間花了,要求指數最後請求的索引),似乎所有的二進制搜索請求都被打印出來,並且很少有線性請求也被打印出來。

如何讓它走得更快有什麼建議?

+0

磁盤上的二進制搜索無法正常工作。這就是爲什麼我們有B型樹。 – EJP

+1

考慮使用較少的內存。你可以使用花車而不是雙打? – maaartinus

+0

100k雙打「僅」6.25MB。數據集真的不適合內存嗎? – EJP

回答

2

方法1

指數數據 - 添加指針快速搜索

  • 分裂您排序數據爲1000桶100個值每個
  • 維護索引引用每個桶的開始和結束
  • 的算法是先找到這個內存索引你的水桶(甚至一個循環是罰款這一點),然後跳轉到內存映射文件中的此存儲桶

這將導致文件(單個存儲桶查找)和最多100個元素的迭代的單跳轉。

方法2

利用輕量級嵌入式數據庫。即MapDB支持Android。