使用Java映射大于2GB的文件
通常可以这样说:对于Java中大于2GB的内存映射文件,如何实现方法使用Java映射大于2GB的文件,java,performance,io,nio,memory-mapping,Java,Performance,Io,Nio,Memory Mapping,通常可以这样说:对于Java中大于2GB的内存映射文件,如何实现方法byte[]get(offset,length) 结合上下文: 我正在尝试通过随机I/o高效地读取大于2GB的文件。当然,我们的想法是使用JavaNIO和内存映射API 这个问题与内存映射的2GB限制有关。解决方案之一是通过偏移量映射多个2GB页面和索引 这里有一个类似的解决方案: 这个解决方案的问题是,它被设计为读取字节,而我的API应该读取字节[](因此我的API类似于读取(偏移量,长度)) 将最终的get()更改为get
byte[]get(offset,length)
结合上下文:
我正在尝试通过随机I/o高效地读取大于2GB的文件。当然,我们的想法是使用JavaNIO和内存映射API
这个问题与内存映射的2GB限制有关。解决方案之一是通过偏移量映射多个2GB页面和索引
这里有一个类似的解决方案:
这个解决方案的问题是,它被设计为读取字节,而我的API应该读取字节[]
(因此我的API类似于读取(偏移量,长度)
)
将最终的get()
更改为get(偏移量,长度)
,是否有效?当我正在读取的字节[]
位于两页之间时,会发生什么情况?不,我的答案是无法将get()
更改为get(偏移量,长度)
,因为内存映射的文件数组边界,正如您所怀疑的那样。我可以看到两种可能的解决办法:
将失去哪些性能增益?如果您返回的是
字节[]
,那么您仍然是从mmap()
ed区域进行复制。在相同的总字节数上调用System.arraycopy
两次而不是一次并没有那么糟糕。@Scott Lamb:我同意当get()
需要从“二进制搜索”算法中的两个不同映射读取时,对于那些可能罕见的边缘条件,性能影响可以忽略不计。我的回答是,您需要围绕这一点进行编码,因此有两个选项。只需在没有新代码的情况下添加偏移量get()
将导致硬错误,如索引越界错误。