MappedByteBuffer滑动窗口

时间:2012-03-05 16:17:34

标签: java file nio

有没有办法让MappedByteBuffer在文件上有一个滑动窗口。我有一个非常大的文件(20GB)但我只想一次制作100MB。我试过这个只是丢弃旧缓冲区并从chanel创建一个新缓冲区,但这会占用内存,因为旧的缓冲区似乎没有被重用。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您可以使用

强制旧缓冲区立即释放内存
((DirectBuffer) buffer).cleaner().clean();

免责声明:我只在Sun / Oracle / OpenJDK Java 6更新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位机器上虚拟内存非常便宜,这不是你需要担心的事情。

BTW:大多数64位机器实际上仅限于48位虚拟内存。这是256 TB的限制,而不是他们理论上可以解决的16 EB(18,000,000 TB)。


您可能会发现这个图书馆很有趣。之前我没有提到它,因为它可能不适合你,但你可能会发现我在代码中使用的方法和一些技巧很有趣。

https://github.com/peter-lawrey/Java-Chronicle