Java大文件磁盘IO性能

18

我在硬盘上有两个文件,每个文件容量为2GB,想要将它们相互比较:

  • 使用Windows资源管理器进行复制需要大约2-4分钟(即读取和写入 - 在同一物理和逻辑磁盘上)。
  • 使用java.io.FileInputStream读取两次,再逐字节比较字节数组需要20多分钟。
  • java.io.BufferedInputStream的缓冲区为64kb,文件被分块读取后进行比较。
  • 比较是在一个紧密循环中完成的,例如:

    int numRead = Math.min(numRead[0], numRead[1]);
    for (int k = 0; k < numRead; k++)
    {
       if (buffer[1][k] != buffer[0][k])
       {
          return buffer[0][k] - buffer[1][k];
       }
    }
    
    我该怎么做才能加快速度? NIO是否比普通流更快? Java是否无法使用DMA / SATA技术,而是使用一些慢速的操作系统API调用?
    编辑:感谢答案。我进行了一些基于它们的实验。正如Andreas所示,流或NIO方法没有太大区别。更重要的是正确的缓冲区大小。
    我的实验证实了这一点。由于文件以大块读取,即使使用附加缓冲区(BufferedInputStream),也不会有任何效果。优化比较可能,我使用32倍展开获得最佳结果,但与磁盘读取相比,比较时间很短,因此加速很小。看来我没什么可做的了;-(

1
注意:默认情况下,操作系统会处理所有文件I/O操作中的DMA/SATA技术(在现代操作系统上)。 - ivan_ivanovich_ivanoff
11个回答

-1

尝试将输入流的缓冲区设置为几兆字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接