如何通过网络传输大文件(文件大小>堆大小)?

时间:2012-04-16 11:02:55

标签: java data-structures

如何通过网络传输大文件(文件大小>堆/ RAM大小)?

让我们说我有文件(大小10GB)我想把机器a(RAM 512mb)转移到机器b  (RAM 512mb)。

想用java代码实现这一点。

首先,有可能吗?关于框架的任何建议。如果可能的话,我们可以使用线程加快速度吗?重要标准:在传输过程中需要维护文件的数据序列。任何一个例子都会有很大的帮助。

4 个答案:

答案 0 :(得分:3)

当然有可能。你只需要使用流。如果线程将提高传输速度取决于您的网络,我会说你无法获得改进,因为你正在实现发送器和接收器(并且你不会限制带宽)。因此,限制因素将是您无法扩展的网络带宽。但是你可以考虑压缩你的流。

在不知道您的要求的情况下很难给出一个例子。例如,我们使用RMIIO通过RMI传输文件。但如果您不被迫使用RMI,我不建议这样做。

答案 1 :(得分:1)

  

首先,有可能吗?

您可以一次读取和写入一个块,例如byte[]为8 KB。

  

关于框架的任何建议。如果可能的话,我们可以使用线程加快速度吗?

您可以通过增加带宽来加快速度。它不太可能是CPU是你的瓶颈所以它不太可能的线程会使它更快(但它会使你的代码更复杂)

  

任何例子都会有很大的帮助。

网上已有数百万人。 ;)

答案 2 :(得分:1)

使用流式传输。这意味着您将数据读入固定大小的缓冲区,比如64 kB,然后在缓冲区中发送数据,然后读取另一个缓冲区 - 充满数据,依此类推。这样,无论文件的大小如何,您都需要恒定的内存量(它甚至可以是无限的,您甚至可以继续传输它而不会占用太多内存)。查看使用SocketChannel的{​​{1}}中的InputStream's methods which read bytes into an arraynio

答案 3 :(得分:1)

  

首先,有可能吗?

当然。

  

关于框架的任何建议。

没有框架。你只需读取一个缓冲区/写一个缓冲区,直到它全部完成。

  

如果可能,我们可以使用线程加快速度吗?

使用一个线程从本地读取而另一个线程写入网络套接字不太可能有所帮助。在大多数情况下,您可以将文件读取速度比将其写入网络快几十倍或几百倍,因此双缓冲的加速空间很小。

在某些情况下,您可以通过使用多个并行流执行传输来获得更多吞吐量。但是,这也可能导致网络拥塞,并且可能导致吞吐量降低。当然,您可能会损害其他用户的网络性能。

所以我的建议是不要费心去尝试通过多线程加速转移,除非这是一个关键问题,你可以花很多时间来解决这个问题。