Ton*_*ony 8 java nio memory-mapped-files
是否可以在Java中对大型文件(多个GB)进行内存映射?
这种方法FileChannel看起来很有希望:
MappedByteBuffer map(FileChannel.MapMode mode, long position, long size)
Run Code Online (Sandbox Code Playgroud)
双方position并size允许64位值-到目前为止,那么好。
MappedByteBuffer,但是,仅提供用于32位位置(get(int index),position(int newPosition)等)的方法,这似乎暗示我无法映射大于2 GB的文件。
我如何解决这个限制?
看看使用内存映射文件获取巨大的矩阵代码,其中显示了如何创建的列表(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));
}
Run Code Online (Sandbox Code Playgroud)
根据JDK-6347833(fs)增强MappedByteBuffer在64位平台上支持大于2GB的大小,其2 GB限制的原因是:
MappedByteBuffer是具有附加操作以支持内存映射文件区域的ByteBuffer。为了支持映射大于Integer.MAX_VALUE的区域,将需要并行的类层次结构。目前,唯一的解决方案是创建多个MappedByteBuffer,每个MappedByteBuffer对应一个不大于2GB的区域。
| 归档时间: |
|
| 查看次数: |
375 次 |
| 最近记录: |