我的 Java 应用程序使用内存映射文件(MappedByteBuffer、FileChannel 和 RandomAccessFile)处理大型二进制数据文件。它经常需要增大二进制文件 - 我当前的方法是使用更大的区域重新映射文件。
它可以工作,但是有两个问题
- 随着文件变大,Grow 需要的时间也越来越长。
- 如果增长速度非常快(例如在 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/