2015-11-13 20 views
1

我想連續在網絡上傳輸數據。源給我一個字節數組,我想存儲在一個數據結構中,作爲緩衝區來補償任何網絡滯後。在java中排隊字節數據

以隊列方式存儲字節的最有效的數據結構是什麼?把它想象成一個管道,其中一個線程在數據中抽取,另一個線程通過網絡讀取併發送數據,而管道本身足夠長以包含多個輸入數據幀。

Queue足夠高效嗎?如果你把byte S IN一次一個

回答

2

一個隊列不會是有效的。它會吃大量的記憶,產生GC壓力,並且放慢速度。

你可以做的開銷隊列的合理,如果你把合理的大小(比如64KB)byte[] S或ByteBuffer S IN他們。該緩衝區大小可以根據性能實驗進行調整和更改,或者甚至可以在運行時自適應。

TCP已經補償了網絡滯後。如果你使用的是UDP,那麼你需要正確處理擁塞或者事情會變得很糟糕。在實踐中,使用TCP或UDP直接創建了大量額外的工作並重新設計了車輪。

ZeroMQ(或純Java JeroMQ)是一個很好的庫選項與高效的有線協議(足夠實時股票交易平臺)。它透明地處理隊列,併爲不同的客戶端模型提供了很多選項,包括像PUB SUB這樣的東西,如果廣播上有很多客戶端,這將有所幫助。在一個過程中,ZeroMQ可以管理作爲生產者和消費者的數據排隊。您甚至可以使用它來有效地將相同的字節廣播給使用同一個流執行獨立事情的工作人員(例如:使用計量和執行轉碼)。

還有其他的庫也可以工作。例如,我認爲Netty可以有效地處理這種情況。

+1

我更感興趣的數據結構,網絡傳輸僅僅是一個應用程序中使用它,並可以改變,例如,如果我想在本地處理數據,而不是發送它的。 – Allahjane

+0

有趣。在這種情況下,ZeroMQ仍然很好,因爲它對於高效的內部進程(線程之間)也起作用。 –

+1

hmm :(沒有與JDK綁定的api中的任何東西? – Allahjane

0

你應該看看奧基奧libraray

+0

我downvoting,因爲沒有明確的解釋爲什麼** OKIO **將解決問題。 –

+0

有些用戶可以使用google,只需要正確的關鍵字 – ligi