【问题标题】:Java File IO performance?Java 文件 IO 性能?
【发布时间】:2015-03-25 13:18:45
【问题描述】:

我正在使用 RandomAccesFile 并一次写入 10MB 的数据块。以下是源码。这里是在 write 调用中写入 10MB 数据。大约需要 700 毫秒。有没有办法使用文件通道或其他方式来改善这一点。文件系统是 NFS。

        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
        OutputStream output = Channels.newOutputStream(randomAccessFile.getChannel());
            randomAccessFile.seek(offset);

        output.write(data, 0, dataLength);//10MB
        output.flush();

【问题讨论】:

  • 你真正想要达到什么目的?
  • 10 MiB 在不到一秒的时间内是合理的,老实说;不要忘记您必须通过网络,并且网络开销不可忽略。您可以在此处获得的主要性能提升是通过检查和修改 NFS 服务器/客户端的配置(如有必要)。
  • 你可以压缩你的数据
  • 它是一个 servlet,它以 10MB 的块读取 POST 数据并保存到文件中。如果失败,将数据读入块以重试文件操作。
  • randomAccessFile 在您测试它时不能为空。您应该直接使用RandomAccessFile 编写,并完全摆脱Channels 和OutputStream 的东西。

标签: java performance io nfs


【解决方案1】:

NFS 是 by definition 是非本地的,因此您几乎受限于网络带宽 - 能够在 700 毫秒内写入 10MiB 等于拥有 14,28 MiB/s 的带宽 - 大约是 119Mbit所以我猜你实际上是在谈论 MB/s 在这种情况下你仍然有 114Mbit .... 好吧,我假设你在 Gigabit-LAN​​ 上。

在这种情况下,您确实会遇到一些性能问题,因为 gbit-LAN​​ 可以做的远不止这些。有几个步骤可以找到根本原因:

  • 检查是否有其他应用程序正在运行
  • 检查您的网卡是否有一些错误设置(如果可能,请重置为出厂默认设置)
  • 检查其他应用程序是否能够比这更快地传输数据

最后(如果问题仍然存在):

【讨论】:

    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2014-10-23
    • 2012-10-13
    相关资源
    最近更新 更多