有没有办法让MappedByteBuffer在文件上有一个滑动窗口.我有一个非常大的文件(20GB)但我只想一次制作100MB.我试过这个只是丢弃旧缓冲区并从chanel创建一个新缓冲区,但这会占用内存,因为旧缓冲区似乎没有被重用.
有任何想法吗?
您可以强制旧缓冲区立即释放内存
((DirectBuffer) buffer).cleaner().clean();
Run Code Online (Sandbox Code Playgroud)
免责声明:我仅将其与 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)。
您可能会发现这个库很有趣。我之前没有提到它,因为它可能不适合您,但您可能会发现我在代码中使用的方法和一些技术很有趣。
https://github.com/peter-lawrey/Java-Chronicle