使用Java映射大于2GB的文件

时间:2011-02-22 21:23:24

标签: java performance io nio memory-mapping

通常可以说:如何为Java中大于2GB的内存映射文件实现方法byte[] get(offset, length)

有了上下文:

我正在尝试使用随机i / o高效读取大于2GB的文件。当然,我们的想法是使用Java nio和内存映射API。

问题在于内存映射限制为2GB。其中一个解决方案是映射多个2GB的页面并通过偏移量进行索引。

这里有一个类似的解决方案:

Binary search in a sorted (memory-mapped ?) file in Java

此解决方案的问题在于它设计为在我的API应该读取byte[]时读取字节(因此我的API类似于read(offset, length))。

是否可以将最终的get()更改为get(offset, length)?当byte[]我正在阅读两页之间时会发生什么?

1 个答案:

答案 0 :(得分:4)

不,我对Binary search in a sorted (memory-mapped ?)的回答无法将get()更改为get(offset, length)因为内存映射文件数组边界,就像您怀疑的那样。我可以看到两种可能的解决方案:

  1. 重叠内存映射文件。执行读取操作时,请在读取的起始字节之前使用起始字节选择内存映射文件。对于大于最大内存映射大小50%的读取,此方法不起作用。
  2. 创建一个字节数组创建方法,从两个不同的两个不同的内存映射文件中读取。我并不热衷于这种方法,因为我认为一些性能提升会因为生成的数组而丢失不会被内存映射。