繁体   English   中英

有没有办法在 Java 中映射大于 Integer.MAX_VALUE 的文件?

[英]Is there a way to memory-map files in Java that are larger than Integer.MAX_VALUE?

FileChannel#map用于映射文件(即启动内存映射),需要long作为长度参数。

然而, 关于FileChannel#map的文档说明如下:

size - 要映射的区域的大小; 必须为非负且不大于 Integer.MAX_VALUE

首先,如果他们只允许高达Integer.MAX_VALUE值,为什么他们首先使用 long ? 是否有可能一次映射大于那个的文件?

例如,如果我想映射一个 10GB 的文件,我想写这样的东西(由于长度太大,它以InvalidArgumentException结束):

long length = 10_000_000_000;
MappedByteBuffer buffer = (new RandomAccessFile("./memory.map", "rw")).getChannel().map(FileChannel.MapMode.READ_WRITE, 0, length);

我是否必须为此创建连续的内存映射,例如,5 个内存映射,每个映射给定文件的 2GB?

FileChannel#map 将返回一个ByteBuffer实例 (MappedByteBuffer),如果您查看它,您会发现它的方法专门使用int来索引数据,例如:

抽象字节 get(int index) 绝对 get 方法。

这也定义了map本身的限制。

因此,您必须逐个映射文件或使用一些现有库(例如https://github.com/xerial/larray )来映射更大的文件,该文件使用 JNI 映射大于 2GB 的文件,并提供它的自己的缓冲区抽象,使用long数据指针。

还有一个选择是使用不安全的操作,如描述在这里

JDK14 通过引入外部内存访问 API (JEP 383) 预览版,为 FileChannel API 的这种限制提供了新的解决方案。 请参阅MemorySegment.mapFromPath()方法以开始使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM