【问题标题】:Transfer a File over a network using TCP (Speed up the transfer)使用 TCP 通过网络传输文件(加速传输)
【发布时间】:2013-02-11 15:42:27
【问题描述】:

我一直在尝试通过Socket 连接发送一个大文件,但它运行缓慢,我想知道是否可以通过某种方式优化此代码以提高传输速度。

这是我发送文件的代码:

byte[] buffer = new byte[65536];
int number;

while ((number = fileInputStream.read(buffer)) != -1) {
    socketOutputStream.write(buffer, 0, number);
}

socketOutputStream.close();
fileInputStream.close();

这是我用来在另一台机器上接收文件的:

byte[] buffer = new byte[65536];

InputStream socketStream= clientSocket.getInputStream();
File f=new File("C:\\output.dat");

OutputStream fileStream=new FileOutputStream(f);

while ((number = socketStream.read(buffer)) != -1) {
    fileStream.write(buffer,0,number);
}

fileStream.close();
socketStream.close();

我认为写入 fileStream 需要花费大部分时间。任何人都可以提供任何建议来加快此代码的速度。

【问题讨论】:

    标签: java performance sockets networking


    【解决方案1】:

    除了close 语句缺少finally 块之外,该代码没有任何明显错误。

    多少数据需要多长时间? FileOutputStream 不太可能花时间 - 更有可能是网络速度很慢。您可以潜在地从网络读取并并行写入文件系统,但这需要大量工作才能正确完成,而且不太可能带来那么多好处,IMO。

    【讨论】:

    • 你是对的。我能够在 1111 秒内传输大约 1327582120 个字节。fileOutputStream.read(..) 语句总共花费了大约 7 秒,考虑到文件的大小,这似乎很正常。问题实际上出在曾经给我不同传输速率的网络上(我有很多 PC 连接到这个网络)。话虽如此,这段代码是否有任何改进的余地? :) 像 IPMSG 这样的工具给我的传输速率比我在这里得到的要好一些,所以我想知道是不是我的错误代码造成了麻烦。
    • @aneesh:您必须非常仔细地查看网络级别的情况 - 但我怀疑您只需要 显着 额外的复杂性 轻微的 性能提升。话虽如此,1MB/秒似乎并不是特别快——这是在什么样的网络上?
    • @aneesh:什么样的wifi?如果只是802.11b,8Mbits就不错了。如果是G,没那么多……反正如果专用网络传输工具做的更好一点,我就放弃了。
    • 这是一个 G,我并不总是获得 1MB/秒的传输速率。有时它会下降到一半。
    【解决方案2】:

    您可以尝试在 FileOutputStream 周围使用 BufferedOutputStream。无论您从网络读取的计数如何,它都会对所有磁盘写入进行块对齐。我不认为会有很大的不同,但它可能会有所帮助。

    【讨论】:

      【解决方案3】:

      我在 FTP 处理大文件时遇到了类似的问题。我意识到使用相同的缓冲区从硬盘读取和写入网络是问题所在。文件系统 IO 喜欢更大的缓冲区,因为硬盘驱动器执行所有查找和读取的工作要少得多。另一方面,网络则倾向于使用较小的缓冲区来优化吞吐量。

      解决方案是使用大缓冲区从硬盘读取,然后将该缓冲区以较小的块写入网络流。

      对于任何具有 4mb 读取和 32kb 写入的文件的整个长度,我能够以 100% 的利用率最大化我的 NIC。然后,您可以通过一次读取 32kb 并将其存储在内存中,然后一次将 4mb 写入硬盘驱动器来在服务器上执行镜像版本。

      【讨论】:

        猜你喜欢
        • 2014-04-15
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-14
        相关资源
        最近更新 更多