gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:15:59 25 4
gpt4 key购买 nike

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

一些有用的信息:

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

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

最佳答案

方法一

索引您的数据 - 添加用于快速搜索的指针

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

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

方法二

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com