有什么方法可以让 MappedByteBuffer 在文件上有一个滑动窗口。我有一个非常大的文件 (20GB),但我一次只想制作 100MB。我试过这只是丢弃旧缓冲区并从 channel 创建一个新缓冲区,但这会占用内存,因为旧缓冲区似乎没有被重用。
有什么想法吗?
最佳答案
您可以强制旧缓冲区立即释放它的内存
((DirectBuffer) buffer).cleaner().clean();
免责声明:我只将它用于 Sun/Oracle/OpenJDK Java 6 update 18 及更高版本。它可能无法在旧版本或其他平台上使用或无法正常工作。谢谢@EJP。
除非你有一个 32 位操作系统,否则我会直接将整个文件映射到内存中(使用多个映射)这将更有效且更易于管理。在这种情况下,我只清理 ByteBuffers 作为关闭文件的一部分(在单元测试中)
您可以使用 TB 的虚拟内存,并使用很少的物理空间甚至磁盘空间。在此示例中,我在具有 24 GB 内存和 120 GB 驱动器的计算机上映射 8 TB 虚拟内存。
http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html
总结:在 64 位机器上,虚拟内存非常便宜,您无需担心。
顺便说一句:大多数 64 位机器实际上仅限于 48 位虚拟内存。这是 256 TB 的限制,而不是他们理论上可以解决的 16 EB(18,000,000 TB)。
您可能会发现这个库很有趣。我之前没有提到它,因为它可能不适合你,但你可能会发现我在代码中使用的方法和一些技巧很有趣。
关于java - MappedByteBuffer 滑动窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9570055/