Java中的内存映射大文件

13

在Java中,是否有可能对巨大文件(多个GB)进行内存映射?

这个FileChannel的方法看起来很有前途:

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

positionsize中,两者都允许64位的值 - 到目前为止还好。

然而,MappedByteBuffer只提供32位位置的方法(get(int index), position(int newPosition)等),这似乎意味着我不能映射大于2GB的文件。

我该如何解决这个限制?


你可以考虑将数据加载到数据库中,并从那里进行操作。 - Arnaud Denoyelle
2个回答

12

看一下使用内存映射文件处理巨大矩阵的代码,它展示了如何创建一个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的区域,需要创建一组并行的类层次结构。目前唯一的解决方案是创建多个MappedByteBuffers,其中每个对应的区域不超过2GB。

4
如前所述,由于使用整数索引/位置指针,MappedByteBuffer存在2GB的限制。
要克服这个问题,您可以使用另一种实现方式,如larray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接