java - MappedByteBuffer 滑动窗口

标签 java file nio

有什么方法可以让 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)。


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

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

关于java - MappedByteBuffer 滑动窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9570055/

相关文章:

java - 将 JSON 数组从 android 发送到 servlet

java - 管理不同的资源目录

Java HTTP PUT 不发送数据

java - 如何使用java执行CMD命令?

java - 打印 JTextField 中的数组项

c - 如何将字符串从文件传递到链表

c - Linux套接字编程: Socket writing line to a file in c

python - 使用 python 对文件进行排序

JAVA NIO Bytebuffer.allocateDirect() 超过 int 的大小限制

java.net.BindException : Address already in use: bind - when stating tomcatx with jdk1. 8(未处于 Debug模式)