2015-07-22 193 views
0

我試圖從多臺(8臺)遠程計算機向單臺計算機(主進程)傳輸大量數據(long int數組)。所有這些都通過一個100 MBps的局域網連接,並且是相同的機器(所以不用擔心內存不足)。通過套接字傳輸大型數組的最快方法

每臺遠程機器都有一個長8GB的int數組,我必須將它傳輸到單臺計算機進行處理。我的問題是將這些陣列快速轉移到主流程的最佳方式是什麼。我嘗試使用傳統的TCP來完成這項工作,並且傳輸數據需要大量時間(大約28分鐘)。有什麼辦法可以提高速度嗎? 。將切換到UDP幫助我嗎?會使用多個端口/套接字幫我緩衝嗎?什麼是解決這些問題的最佳方法?

我可能不會壓縮數據(其中大部分是唯一的),我需要發送的一切(我的主要工序進行重要的操作)

+5

只是一個想法 - 你有沒有嘗試過壓縮? –

+0

你真的需要一次發送所有的數據嗎?也許你可以將它存儲在某個地方(例如,在某個數據庫中)並通過塊遞增獲取它?如果您不解釋數據的真實含義以及它來自哪裏,我們無法提供幫助...... –

+4

嘗試將算法移至數據,而不是將數據移至算法。也許map-reduce可以幫助你。 – nwp

回答

2

您可以嘗試壓縮你的陣列。有幾種算法可以找到,這post可能會幫助你。它提供了三種最知名的無損算法的解釋:
1.霍夫曼樹型算法它有很多應用和專業化
2.遊程編碼的RLE非常適合圖標壓縮
3. LZ77它使用一個字典並且是許多不同算法的基礎

無損算法是您需要的,因爲您不想丟失數組中的數據。這就是爲什麼我不會推薦UDP的原因,因爲它不檢查數據是否已被接收。

+0

請引用您鏈接中的相關信息,因爲鏈接的信息可能會更改或完全刪除。 – hlt

+1

我加了精度,希望現在好多了 – Pumkko

+1

太好了,謝謝! (未來:人們傾向於投票刪除只有鏈接的答案) – hlt

3

首先,升級您的硬件。使用1GB網卡(或10GB,如果你有預算)和一個體面的交換機,你可以獲得10倍的提升,無需編碼,傳輸8GB數據需要大約,只需一分鐘。用NIC綁定進一步推進,你再次加倍到只需 30秒(或比你快60倍)。

接下來,調整你的算法,你是否需要頻繁發送整個8GB數據?你可以通過流式處理,還是隻發送差異(副本),以便獲得良好的數據處理吞吐量?

你可以做的最後一件事是壓縮,更好地做塊,這樣你就不會一次壓縮整個8GB。