快速生成非常大的二进制文件的最佳做法是什么?

2 java clojure

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

它有效,但有两个问题

  1. 随着文件变大,Grow会花费越来越多的时间.
  2. 如果生长非常迅速(EG在一段时间(真实)循环中),JVM将在重新映射操作完成大约30,000次以后永远挂起.

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

另外我无法弄清楚为什么会出现第二个问题.还请提出您对该问题的看法.

谢谢!

增长文件的当前代码,如果它有帮助:

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

Kei*_*all 5

您可能希望以更大的块增长文件.每次重新映射时使用加倍,如动态数组,以便增长成本是一个摊销常数.

我不知道为什么重新映射会在30,000次后挂起,这看起来很奇怪.但是,你应该能够逃脱一个不少,如果你使用的方案,我建议低于30,000重映射.