11

可以笼统地说:如何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[]我正在阅读的内容位于两页之间时会发生什么?

4

1 回答 1

4

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

  1. 重叠内存映射文件。 当您进行读取时,请在读取的起始字节之前选择起始字节的内存映射文件。此方法不适用于大于最大内存映射大小 50% 的读取。
  2. 创建从两个不同的两个不同的内存映射文件读取的字节数组创建方法。 我不热衷于这种方法,因为我认为会失去一些性能提升,因为生成的数组不会被内存映射。
于 2011-04-06T07:18:30.527 回答