如何通过网络传输大文件(文件大小>堆/RAM大小)?
假设我有文件(大小 10GB),我想将它传输到机器 a(RAM 512mb)到机器 b(RAM 512mb)。
想用java代码实现这个。
首先,可能吗?关于框架的任何建议。如果可能的话,我们可以使用线程加速吗?重要标准:在传输过程中需要维护文件的数据顺序。任何例子都会有很大帮助。
如何通过网络传输大文件(文件大小>堆/RAM大小)?
假设我有文件(大小 10GB),我想将它传输到机器 a(RAM 512mb)到机器 b(RAM 512mb)。
想用java代码实现这个。
首先,可能吗?关于框架的任何建议。如果可能的话,我们可以使用线程加速吗?重要标准:在传输过程中需要维护文件的数据顺序。任何例子都会有很大帮助。
当然有可能。你只需要使用流。如果线程将提高传输速度取决于您的网络,我会说您无法获得改进,因为您正在实现发送器和接收器(并且您不会限制带宽)。因此,限制因素将是您无法扩展的网络带宽。但是你可以考虑压缩你的流。
在不了解您的要求的情况下很难举出一个例子。例如,我们使用RMIIO通过 RMI 传输文件。但是,如果您不是被迫使用 RMI,我不建议您这样做。
首先,可能吗?
当然。
关于框架的任何建议。
没有框架。您只需读取一个缓冲区/写入一个缓冲区,直到全部完成。
如果可能的话,我们可以使用线程加速吗?
使用一个线程从本地读取,另一个线程写入网络套接字不太可能有帮助。在大多数情况下,读取文件的速度比将文件写入网络的速度要快几十倍或几百倍,因此双缓冲的加速空间很小。
在某些情况下,您可以通过使用多个并行流执行传输来获得更多吞吐量。但是,这也可能导致网络拥塞,从而导致吞吐量降低。当然,您可能会损害其他用户的网络性能。
所以我的建议是不要费心尝试通过多线程加速传输,除非它是一个关键问题并且你有能力在这个问题上花费大量时间。
首先,可能吗?
您一次读取和写入一个块,例如byte[]
8 KB。
关于框架的任何建议。如果可能的话,我们可以使用线程加速吗?
您可以通过增加您拥有的带宽量来加快速度。CPU 极不可能成为您的瓶颈,因此它不太可能的线程会使其更快(但它会使您的代码更复杂)
任何例子都会有很大帮助。
网络上已经有数百万。;)
使用流传输。这意味着您将数据读入一个固定大小的缓冲区,比如 64 kB,然后在缓冲区中发送数据,然后读取另一个充满数据的缓冲区,依此类推。这样,无论文件大小如何,您都需要恒定数量的内存(它甚至可以是无限的,您可以继续传输它,甚至不会占用太多内存)。查看将InputStream
字节读入数组或SocketChannel
从中nio
使用的方法ByteBuffers
。