2012-04-16 158 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

首先,有可能嗎?

當然。

對框架的任何建議。

沒有框架。您只需讀取一個緩衝區/寫入一個緩衝區,直到全部完成。

如果可能,我們可以使用線程加速嗎?

使用一個線程從本地讀取而另一個線程寫入網絡套接字不太可能有所幫助。在大多數情況下,您可以比將數據寫入網絡快幾十倍或幾百倍的速度讀取文件,所以通過雙緩衝提高速度的空間很小。

在某些情況下,您可以通過使用多個並行流執行傳輸來獲得更多吞吐量。但是,這也可能導致網絡擁塞,並導致吞吐量下降。當然,您可能會傷害其他用戶的網絡性能。

所以我的建議是不要打擾嘗試通過多線程加速傳輸,除非它是一個關鍵問題,並且您可以承擔在該問題上花費大量時間。