2012-04-16 159 views
1

如何通过网络传输大文件(文件大小>堆/ RAM大小)?假设我有文件(大小为10GB),我想将它传送给机器(RAM 512mb)到机器b (RAM 512mb)。如何通过网络传输大文件(文件大小>堆大小)?

想用java代码实现这一点。

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

回答

3

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

一个例子很难给出,如果不知道你的要求。例如,我们使用RMIIO来通过RMI传输文件。但是如果你不被迫使用RMI,我不会推荐你这样做。

+0

我正在使用JavaFX和RMIIO一起发送文件,但如果我有一个“大”文件(如视频),则界面正在被阻止。你有什么建议来改善这个吗?我试图在不同的线程中运行代码,但它似乎无法工作。 – nbro 2016-04-07 08:05:26

+0

由于您在UI线程上进行传输,UI肯定会冻结。也许你的线程实现是错误的。我不会责怪RMIIO。如果您无法修复该线程,则可能需要打开一个新问题并在代码中发布[SSCCE](http://sscce.org/)。 – Kai 2016-04-07 09:32:36

+0

在这里你有我刚才问的问题:http://stackoverflow.com/questions/36471224/how-to-send-a-big-file-using-rmiio-when-using-javafx-without-freezing-the-ui – nbro 2016-04-07 09:35:46

1

首先,有可能吗?

您一次读写一个块,例如, 8KB的byte[]

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

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

任何示例将是很大的帮助。

已经有数百万的网页了。 ;)

+0

感谢您的回答。目前正在寻找数百万人之一。 :)你能指点我可靠的解决方案/网址吗? – neo 2012-04-16 11:15:49

+1

最好的解决方案通常取决于你在做什么,但核心是非常基本的。如果你不确定我会使用'IOUtils.copy'你可以看看它的源代码,看看它是如何完成的。 – 2012-04-16 11:18:47

+0

哈,我不得不重读5次第一句话......“你一次读写_bit_”。 – jtahlborn 2012-04-16 11:55:38

1

使用流式传输。这意味着你将数据读入一个固定大小的缓冲区,比如说64 kB,然后将数据发送到缓冲区,然后读取另一个缓冲区 - 充满数据,等等。这样,无论文件的大小如何,它都需要一个恒定的内存量(甚至可以是无限大的,并且即使没有使用太多内存也可以继续传输)。检出InputStream's methods which read bytes into an arraySocketChannelnio它使用ByteBuffers

1

首先,有可能吗?

当然。

对框架的任何建议。

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

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

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

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

所以我的建议是不要打扰尝试通过多线程加速传输,除非它是一个关键问题,并且您可以承担在该问题上花费大量时间。