java - 如何提高 MappedByteBuffer 的性能以适应我的用例?

标签 java android performance nio

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

一些有用的信息:

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

关于如何让它运行得更快有什么建议吗?

最佳答案

方法 1

为数据建立索引 - 添加快速搜索的指针

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

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

方法 2

利用轻量级嵌入式数据库。 IE。 MapDB支持安卓。

关于java - 如何提高 MappedByteBuffer 的性能以适应我的用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19616166/

相关文章:

java - 我应该使用哪种 java swing 布局

javascript - 不同进程虚拟机的 JIT 编译器如何实现事件窥视?

java - 使用 Appium for java 的 ios UI 自动化。无法使用 xPath 找到元素

java - setNavigationItemSelectedListener 不工作

android - 如何通过 Volley Request 传递 HttpPost( URI )?

performance - 为了性能而允许数据库中存在冗余数据

java - 使用 Executors.newFixedThreadPool() 的内存泄漏

java - 我怎样才能在linux中制作jar?

android - Android 拖影的 'target point' 如何从它的 'touch point' 移开?

java - 为什么降序循环比升序循环快?