如何改进MappedByteBuffer为我的用例获取性能?

时间:2013-10-27 08:41:59

标签: java android performance nio

我有几个100k值的大型double和long数组,每个都需要在给定时间进行计算才能进行计算,即使使用largeHeap请求Android操作系统也没有给我足够的内存,并且我在大多数测试设备中不断出现内存异常。所以我去研究如何克服这个问题,根据我在previous question得到Waldheinz的答案,我实现了一个基于文件的数组,使用RandomAccessMemory获取通道,然后使用按照建议使用MappedByteBuffer,并使用MappedByteBuffer asLongBuffer或asDoubleBuffer。这完美,我100%消除了outofmemory异常。但表现很差。我得到很多调用来获取(一些索引),每个调用大约需要5-15毫秒,因此用户经验被破坏

一些有用的信息:

  1. 我在数组上使用二进制搜索来查找开始和结束索引,然后我从头到尾有一个线性循环
  2. 我为任何get()调用添加了一个打印命令,完成时间超过5毫秒(打印出时间,请求的索引和最后请求的索引),好像打印了所有二进制搜索获取请求,很少有线性请求。
  3. 有关如何让它更快的任何建议吗?

1 个答案:

答案 0 :(得分:2)

方法1

索引数据 - 添加快速搜索指针

  • 已排序的数据拆分为1000个桶,每个值100个
  • 维护引用每个存储桶开始和结束的索引
  • 算法首先在这个内存索引中找到你的存储桶(即使循环很好),然后在内存映射文件中跳转到这个存储桶

这将导致单个文件跳转(要查找的单个存储桶)和最多100个元素的迭代。

方法2

利用轻量级嵌入式数据库。即MapDB支持Android。