1

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

假设我有文件(大小 10GB),我想将它传输到机器 a(RAM 512mb)到机器 b(RAM 512mb)。

想用java代码实现这个。

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

4

4 回答 4

3

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

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

于 2012-04-16T11:04:18.577 回答
1

首先,可能吗?

当然。

关于框架的任何建议。

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

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

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

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

所以我的建议是不要费心尝试通过多线程加速传输,除非它是一个关键问题并且你有能力在这个问题上花费大量时间。

于 2012-04-16T11:25:42.767 回答
1

首先,可能吗?

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

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

您可以通过增加您拥有的带宽量来加快速度。CPU 极不可能成为您的瓶颈,因此它不太可能的线程会使其更快(但它会使您的代码更复杂)

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

网络上已经有数百万。;)

于 2012-04-16T11:07:59.507 回答
1

使用流传输。这意味着您将数据读入一个固定大小的缓冲区,比如 64 kB,然后在缓冲区中发送数据,然后读取另一个充满数据的缓冲区,依此类推。这样,无论文件大小如何,您都需要恒定数量的内存(它甚至可以是无限的,您可以继续传输它,甚至不会占用太多内存)。查看将InputStream字节读入数组SocketChannel从中nio使用的方法ByteBuffers

于 2012-04-16T11:11:57.723 回答