2

我有几个 100k 值的大型 double 和 long 数组,每个数组都需要在给定时间访问以进行计算,即使有 largeHeap 请求,Android OS 也没有给我足够的内存,而且我在大多数测试设备中不断出现内存不足的异常。所以我开始研究克服这个问题的方法,根据我在上一个问题中从 Waldheinz 得到的答案,我实现了一个基于文件的数组,使用 RandomAccessMemory 获取通道,然后按照建议使用 MappedByteBuffer 映射它,并使用 MappedByteBuffer asLongBuffer 或 asDoubleBuffer。这很完美,我 100% 消除了内存不足的异常。但性能很差。我收到很多调用 get(some index) 的调用,每个调用大约需要 5-15 毫秒,因此用户体验被破坏了

一些有用的信息:

  1. 我在数组上使用二进制搜索来查找开始和结束索引,然后我有一个从开始到结束的线性循环
  2. 我为任何需要超过 5 毫秒才能完成的 get() 调用添加了一个打印命令(打印出所花费的时间、请求的索引和最后请求的索引),似乎所有的二进制搜索获取请求都已打印,并且很少的线性请求也是。

关于如何让它更快的任何建议?

4

1 回答 1

2

方法一

索引您的数据 - 添加指针以进行快速搜索

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

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

方法二

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

于 2013-10-27T09:03:04.410 回答