Java中的内存映射大文件

时间:2019-03-22 13:44:29

标签: java nio memory-mapped-files

是否可以在Java中对大型文件(多个GB)进行内存映射?

这种FileChannel的方法很有希望:

MappedByteBuffer map(FileChannel.MapMode mode, long position, long size)

positionsize都允许使用64位值-到目前为止,还算不错。

MappedByteBuffer,但是,仅提供用于32位位置的方法(get(int index)position(int newPosition)等),这似乎暗示我不能映射大于2 GB的文件。

如何解决此限制?

2 个答案:

答案 0 :(得分:7)

看看Using a memory mapped file for a huge matrix代码,该代码显示如何创建MappedByteBuffer列表,每个列表小于2 GB,以映射整个文件:

private static final int MAPPING_SIZE = 1 << 30;
...
long size = 8L * width * height;
for (long offset = 0; offset < size; offset += MAPPING_SIZE) {
    long size2 = Math.min(size - offset, MAPPING_SIZE);
    mappings.add(raf.getChannel().map(FileChannel.MapMode.READ_WRITE, offset, size2));
}

根据JDK-6347833 (fs) Enhance MappedByteBuffer to support sizes >2GB on 64 bit platforms,限制2 GB的原因是:

  

MappedByteBuffer是一个ByteBuffer,具有附加操作以支持内存映射的文件区域。为了支持映射大于Integer.MAX_VALUE的区域,将需要并行的类层次结构。目前,唯一的解决方案是创建多个MappedByteBuffer,每个MappedByteBuffer对应一个不大于2GB的区域。

答案 1 :(得分:3)

如上所述,MappedByteBuffer由于使用整数索引/位置指针而具有2GB的限制。

要解决这个问题,您可以使用larray

这样的替代实现