如何在Java中实现一个 byte[] get(offset, length)
方法以读取大于2GB的内存映射文件?
背景:
我正在尝试使用随机I/O高效地读取大于2GB的文件。当然,这个想法是使用Java nio和内存映射API。
问题出现在内存映射的2GB限制上。解决方案之一是将多个2GB的页面进行映射,并通过偏移索引。
这里有一个类似的解决方案:
这个解决方案的问题在于它设计用于读取字节,而我的API应该读取byte[]
(所以我的API会像这样:read(offset, length)
)。
如果将最终的get()
更改为get(offset, length)
,会发生什么呢?当我要读取的byte[]
位于两个页面之间时会发生什么?
byte[]
,那么你无论如何都要从mmap()
区域复制。调用两次System.arraycopy
而不是一次,对于相同数量的字节来说并没有太大的影响。 - Scott Lambget()
的性能损失对于那些可能很少出现的边缘条件来说是可以忽略的。我的回答是说您需要编写代码来解决这个问题,因此有两种选择。仅添加偏移量而没有新代码支持get()
将导致像索引超出边界等硬错误。 - Stu Thompson