有没有办法让MappedByteBuffer在文件上有一个滑动窗口。我有一个非常大的文件(20GB)但我只想一次制作100MB。我试过这个只是丢弃旧缓冲区并从chanel创建一个新缓冲区,但这会占用内存,因为旧的缓冲区似乎没有被重用。
有什么想法吗?
答案 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)。您可能会发现这个图书馆很有趣。之前我没有提到它,因为它可能不适合你,但你可能会发现我在代码中使用的方法和一些技巧很有趣。