我有几个大的 double 和 long 数组,每个数组都有 100k 值,需要在给定时间访问它们进行计算,即使请求了 largeHeap,Android 操作系统也没有给我足够的内存,并且在大多数测试设备中我不断遇到内存不足异常。所以我开始研究克服这个问题的方法,根据我在 previous question 中从 Waldheinz 得到的答案。我实现了一个基于文件的数组,使用 RandomAccessMemory 获取到它的 channel ,然后按照建议使用 MappedByteBuffer 映射它,并使用 MappedByteBuffer asLongBuffer 或 asDoubleBuffer。这工作完美,我 100% 消除了内存不足异常。但性能很差。我收到很多对 get(某些索引) 的调用,每次调用大约需要 5-15 毫秒,因此用户体验被破坏了
一些有用的信息:
- 我在数组上使用二分搜索来查找开始和结束索引,然后我有一个从开始到结束的线性循环
- 我为任何需要超过 5 毫秒才能完成的 get() 调用添加了一个打印命令(打印出所花费的时间、请求的索引和最后请求的索引),似乎所有二分搜索 get 请求都已打印,并且很少有线性请求也是如此。
关于如何让它运行得更快有什么建议吗?
最佳答案
方法 1
为数据建立索引 - 添加快速搜索的指针
- 将已排序的数据分为 1000 个桶,每个桶有 100 个值
- 维护一个引用每个存储桶的开始和结束的索引
- 该算法是首先在此内存索引中找到您的存储桶(即使是循环也可以),然后在内存映射文件中跳转到该存储桶
这将导致一次文件跳转(要查找的单个存储桶)以及最多 100 个元素的迭代。
方法 2
利用轻量级嵌入式数据库。 IE。 MapDB支持安卓。
关于java - 如何提高 MappedByteBuffer 的性能以适应我的用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19616166/