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

mar*_*ssi 11 java io performance nio memory-mapping

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

有了上下文:

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

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

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

在Java中的已排序(内存映射?)文件中进行二进制搜索

这个解决方案的问题在于它设计为在我的API应该读取时读取字节byte[](因此我的API就像这样read(offset, length)).

是否只是努力将这种终极get()变为get(offset, length)?当byte[]我在阅读两页之间时会发生什么?

Stu*_*son 4

不,我对排序(内存映射?)中的二进制搜索的回答无法更改,get()因为get(offset, length)内存映射文件数组边界,就像您怀疑的那样。我可以看到两种可能的解决方案:

  1. 重叠内存映射文件。 当您进行读取时,选择起始字节紧接在读取起始字节之前的内存映射文件。此方法不适用于大于最大内存映射大小 50% 的读取。
  2. 创建一个字节数组创建方法,从两个不同的两个不同的内存映射文件中读取。 我不热衷于这种方法,因为我认为一些性能增益将会丢失,因为生成的数组不会被内存映射。