1

我必須解析很多文件。所以現在我打開一個閱讀文件來解析內容並將輸出寫入不同的位置。 這基本上就是我需要做的事情,但我希望能夠加速該過程,因爲我正在解析14000個文件。處理從BlockingCollection讀取的對象

我改進了我的算法,將工作分解爲多個線程。所以我有1個線程做25%的下一個25%的文件等等。

不管怎樣,我相信我會顯着提高性能和速度,如果我有:

  1. Task 1讀取文件,並將該文件的內容在BlockingCollection1(內存)
  2. Task 2會創建多個線程解析BlockingCollection1的內容並將解析的數據放置在BlockingCollection2
  3. Task 3BlockingCollection2中讀取內容並將其寫入磁盤。

我現在的問題是,我得到一個內存不足的例外。我想讓垃圾收集器從BlockingCollection1中刪除項目,如果它們已被使用。如果它們已寫入磁盤,我也希望從BlockingCollection2中刪除項目。

使用BlockingCollection<T>非常方便,因爲一個線程可以將項目添加到該集合,而另一個線程可以處理這些項目。在我使用鏈表之前,我傾向於這個問題:https://stackoverflow.com/a/12519345/637142如何評論和有用的BlockingCollection可以。 反正我怎麼能解決這個問題?我是否必須使用不同類型的集合,如堆棧?

+1

如果您使用'GetConsumingEnumerable',那麼它們已經被刪除... –

+0

看起來您正在構建與TPL Dataflow非常相似的東西。如果你可以使用.Net 4.5,我建議你使用它。 – svick

回答

3

當您創建BlockingCollection<T>實例時,可以使用接受bounding capacity的構造函數。這可以防止您將太多項目一次放入收藏中,這可以幫助您節制「生成」項目的數量,以幫助匹配所消耗項目的數量。

通過保持這種限制,您可以防止自己使用所有內存,因爲您不會比將項寫入磁盤時處理項更快。

+0

裏德快速問題。我有MyFile類,它由兩個字段組成,文件路徑和內容。如果我有一個方法setts這兩個字段= null,以節省內存將是一個好主意?所以當我讀到那個時候,我調用了使這些字段= null的方法。希望我正確解釋。無論如何,只要棧溢出讓我來接受你的答案。非常感謝! –

+2

@TonoNam嗯,它*可以*保存內存(通過提供給GC),但爲什麼不只是刪除對象本身? –