Java内存映射大文件

Java内存映射大文件,java,memory-management,file-io,nio,memory-mapped-files,Java,Memory Management,File Io,Nio,Memory Mapped Files,MappedByteBuffer到2GIG的Java限制使得映射大文件变得很棘手。通常推荐的方法是使用MappedByteBuffer数组并通过以下方式对其进行索引: long PAGE_SIZE = Integer.MAX_VALUE; MappedByteBuffer[] buffers; private int getPage(long offset) { return (int) (offset / PAGE_SIZE) } private int getIndex(long

MappedByteBuffer到2GIG的Java限制使得映射大文件变得很棘手。通常推荐的方法是使用MappedByteBuffer数组并通过以下方式对其进行索引:

long PAGE_SIZE = Integer.MAX_VALUE;
MappedByteBuffer[] buffers;

private int getPage(long offset) {
    return (int) (offset / PAGE_SIZE)
}

private int getIndex(long offset) {
    return (int) (offset % PAGE_SIZE);
}

public byte get(long offset) {
    return buffers[getPage(offset)].get(getIndex(offset));
}
这可能是一个单字节的工作,但是如果您想要处理更大的读/写操作并且需要跨越边界(getLong()或get(byte[]),则需要重写大量代码

问题是:对于这种情况,您的最佳实践是什么?您是否知道任何可以在不重新发明轮子的情况下重复使用的工作解决方案/代码?

您签出了吗

Javadoc 该类的主要用途是使创建真正基于
MappedByteBuffer
的输入流成为可能

特别是,工厂方法
map(FileChannel,FileChannel.MapMode)
将内存将整个文件映射到
ByteBuffer
数组中,并将该数组作为ByteBufferInputStream公开。这使得访问大于2GiB的轻松映射文件成为可能

  • long length()
  • long position()
  • void position(long-newPosition)
那是你一直在想的吗


Integer.MAX_值不是2的幂,也不是基础页面大小的倍数。(通常是4KB)对不起,我没有从内部收到您的评论,它是按页面大小对齐DirectByteBuffers的,我会认为,使用不按页面对齐的数据效率较低,我认为这是不允许的。(不过,我已经测试过了,而且确实如此)您可以直接使用底层本机方法(使用反射)在大于2GB的块中进行映射,但是我还没有想到如何强制它执行磁盘写入。我怀疑这算不上最佳做法,但可以快得多你读过上次你问类似问题的答案/评论了吗:太棒了!看看这里,塞巴斯蒂亚诺·维格纳是个大人物!