Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java映射大于2GB的文件_Java_Performance_Io_Nio_Memory Mapping - Fatal编程技术网

使用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

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

结合上下文:

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

这个问题与内存映射的2GB限制有关。解决方案之一是通过偏移量映射多个2GB页面和索引

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

这个解决方案的问题是,它被设计为读取字节,而我的API应该读取
字节[]
(因此我的API类似于
读取(偏移量,长度)

将最终的
get()
更改为
get(偏移量,长度)
,是否有效?当我正在读取的
字节[]
位于两页之间时,会发生什么情况?

不,我的答案是无法将
get()
更改为
get(偏移量,长度)
,因为内存映射的文件数组边界,正如您所怀疑的那样。我可以看到两种可能的解决办法:

  • 重叠内存映射文件。执行读取操作时,选择内存映射文件,并在读取的开始字节之前选择开始字节。这种方法不适用于大于最大内存映射大小50%的读取
  • 创建一个字节数组创建方法,从两个不同的内存映射文件中读取数据。我不喜欢这种方法,因为我认为由于生成的数组不会进行内存映射,因此会损失一些性能增益

  • 将失去哪些性能增益?如果您返回的是
    字节[]
    ,那么您仍然是从
    mmap()
    ed区域进行复制。在相同的总字节数上调用
    System.arraycopy
    两次而不是一次并没有那么糟糕。@Scott Lamb:我同意当
    get()
    需要从“二进制搜索”算法中的两个不同映射读取时,对于那些可能罕见的边缘条件,性能影响可以忽略不计。我的回答是,您需要围绕这一点进行编码,因此有两个选项。只需在没有新代码的情况下添加偏移量
    get()
    将导致硬错误,如索引越界错误。