2013-12-15 37 views
1

我有一個內存不足的問題,我似乎無法與單聲道/ C#來解決,當我使用並行任務。單聲道/ C#並行任務中未釋放內存。如何解釋分配?

背景:我有一個數據處理密集型應用,從文件中讀取數據塊。每個塊被讀取爲一個字節數組,該數組被傳遞給一個新的StreamReader實例,以便它可以被作爲並行任務工作的線程消耗/處理。在Microsoft CLR上,這個功能完美無缺,並且在處理該文件時內存保持在〜200 MB以下。

但是,在Mono上,不是在整個文件處理過程中保持在相同範圍內的進程內存量,而是線性增加,直到在超過32位地址空間限制後出現內存不足錯誤。我無法理解爲什麼,並試圖解決這個問題。

我使用的探查和堆拍攝工具,以弄清楚什麼是消耗這麼多的內存。看起來,從文件塊中填充數據的字節數組保留的時間比他們應該保留的時間長(儘管偶爾收集),結果程序內存不足。我試圖找出使用堆分析器保留對它們的引用的內容,但它列出了幾個「未知」類型,我不知道這意味着什麼。 enter image description here我試圖確保所有東西在使用後都處置/設置爲空,並且清楚地在MS運行時可以收集和收集。如果有人知道如何解釋heapshot中的這些未知數或進一步診斷/解決這個問題,將不勝感激。作爲參考,下面顯示了堆鏡頭屏幕視圖和任務的代碼片段。

//Run parallel tasks: the enumerator in this foreach statement produces byte[] types 
//and feeds them to a stream reader that it "yields" 
Parallel.ForEach(FQP.GetStreamReaderForSequences(700000),FR => 
     { 
//next code bits that process the FR variable 
//(which is a streamreader wrapping a byte[]) 
.... 
//Now I dispose of the streamreader 
FR.Dispose(); 
FR = null; 
//This didn't help, but ideally there should be no more references to the byte[] type here. 
GC.Collect(); 
}); 
+1

你可能想看看[我這個老問題(http://stackoverflow.com/questions/6977218/parallel -foreach-can-cause-a-out-of-memory-exception-if-working-with-a-enumera),這可能是同一個問題。 –

+0

是的,它看起來和你的老問題完全相似!希望我早點見過! (雖然這說我設置了最大程度的平行選項,但仍然有錯誤,所以當前的答案是錯誤的,因爲我收集了我以上的人得到的原因)。 – evolvedmicrobe

回答