java - 快速增长非常大的二进制文件的最佳实践是什么?

标签 java clojure

我的 Java 应用程序使用内存映射文件(MappedByteBuffer、FileChannel 和 RandomAccessFile)处理大型二进制数据文件。它经常需要增大二进制文件 - 我当前的方法是使用更大的区域重新映射文​​件。

它可以工作,但是有两个问题

  1. 随着文件变大,Grow 需要的时间也越来越长。
  2. 如果增长速度非常快(例如在 while(true) 循环中),则在重新映射操作完成大约 30,000 次以上后,JVM 将永远挂起。

有哪些替代方法,最好的方法是什么?

我也不明白为什么会出现第二个问题。还请提出您对此问题的看法。

谢谢!

当前用于生成文件的代码(如果有帮助的话):

(set! data (.map ^FileChannel data-fc FileChannel$MapMode/READ_WRITE
                         0 (+ (.limit ^MappedByteBuffer data) (+ DOC-HDR room))))

最佳答案

您可能希望将文件分成更大的 block 。每次重新映射时使用加倍,例如 dynamic array ,因此生长成本是一个摊余常数。

我不知道为什么重映射在 30,000 次后挂起,这看起来很奇怪。但如果您使用我建议的方案,您应该能够完成少于 30,000 次的重映射。

关于java - 快速增长非常大的二进制文件的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12418965/

相关文章:

java - JButton - 如何连接?

java - 将小写字母递减为仅小写字母

Java:WAITING从另一台服务器接收值(通过http?)

java - Clojure函数评估

Clojure NullPointerException 与循环和重复

java - 将一个字节分解为 8 位最简单?

java - 单节点java链表中存储多个变量

json - 在 JSON 中序列化和反序列化 Clojure::namespaced-keywords

python - 什么叫做允许模拟浏览器以实现自动化的库?

java - 如何沙盒 clojure.string/blank?在 Clojure 中使用 Clojail?