2017-06-14 38 views
16

我將每獲得一個JSON字符串.01秒甚至更快,並且我必須將它插入某些集合中,以便稍後可以循環遍歷每行並執行一些處理並在此之後刪除該行。插入過程繼續進行。我有點困惑是否使用ArrayListQueue什麼集合類用來存儲長字符串?

所以基本上我會插入第一條消息,然後第二條然後......同時另一個進程將讀取第一個插入的值進行處理並刪除該記錄,然後是第二個插入的值。請告知哪一個最快,存儲量更少?或者其他任何收藏品最適合我的要求?

編輯: 我有兩種方法 -

的getMessages() - 它不斷獲取/這裏將在隊列中的消息(該消息是從只有一個不斷髮送消息並不會停止源接收直到我們手動停止進程)

ProcessMessages() - 這將讀取隊列記錄和處理後,從隊列

+13

'ArrayList'?至少10年以上不建議這樣做。你應該只使用'System.Collections.Generic'中的任何東西。 – user9993

+2

字符串的長度完全不相關,因爲集合只存儲引用。字符串引用的數量是唯一相關的事情和「每一個。01秒「的速度並不快...... – Holger

回答

30

聽起來像是你應該使用ConcurrentQueue<string>,其中一個線程可以把值刪除另一個線程可能會彈出。

肯定don't use or even think of using the pre-generic ArrayList type ever again

您仍然需要一些簿記代碼來檢查您的處理是否比插入運行速度快,否則您可能會在某個時刻內存不足。

+1

我經常看到新的開發者使用'System.Collections'中的垃圾。我猜他們的Java背景讓他們認爲所有來自Java的集合類型都與.NET的集合類型有1:1映射。 – user9993

+8

@ user9993它似乎是顯而易見的地方雖然開始... – Baldrickk

+1

我正在閱讀關於ConcurrentQueue,並且該示例顯示使用for循環在隊列中進行迭代。但我的排隊會不斷增加或減少,所以我怎麼知道什麼時候循環?我想我可以迭代 - if(!concurrentQueue.IsEmpty),正確嗎? – user1254053

11

從我如何讀你的問題,你有兩種基本要求:

  • 這是一個隊列;
  • 同時排隊和出隊是安全的。

我會用ConcurrentQueue:它可以讓你所談論的排隊機制,它也是線程安全的,所以你可以在同一時間,而不需要你自己鎖在隊列中添加和刪除。

如果沒有確切的信息,哪一個是最好的性能和內存智能是很難分辨的。如果你有很多重複的字符串,你可以嘗試實習它們或者在你重複元素的地方創建一個緩存。

+0

我更喜歡@Dmitry Bychenko的回答。這顯然是一種典型的生產者 - 消費者模式,而'BlockingCollection'則是一個更好的主意。無論如何,它已經在內部包裝了一個ConcurrentQueue。 – user9993

21

看來你正在尋找一個生產者 - 消費者設計模式(Wikipedia Producer–consumer_problem)。

  1. 生產者創造的Json的
  2. 消費者處理它們

如果這是你的情況下,嘗試BlockingCollection這是專門爲此設計的。

+4

這可能確實是這個問題的更好的類型,另請參閱https://stackoverflow.com/questions/10010748/what-are-the-differences-between-concurrentqueue-and-blockingcollection-in-net – CodeCaster

+0

@Dmitry Bychenko - 感謝您的建議。這是否適用於FIFO? – user1254053

+0

@ user1254053:可以確保FIFO,請參閱https://stackoverflow.com/questions/3825275/does-blockingcollectiont-guarantee-removal-order –

相關問題