2011-05-05 145 views
1

我有一個我寫的商業應用程序,它通過查找特定Excel文件的目錄結構有效地遞歸併存儲它們的地址。然後循環遍歷這些文件並通過爲每個文件創建一個DocumentParser對象來解析它們,一次只執行一個,而不是異步。該軟件似乎非常穩定,以至於企業希望通過一個包含10000個以上相關Excel文件的大型目錄來運行它。C#垃圾回收

我的問題是,當我每次創建一個新的DocumentParser對象時,GC將足夠有效地丟棄每個對象,當它們超出範圍時,即當該Excel工作表已被解析或存在一種方式我可以監視這一點,並在必要時手動做一個GC?我以前從來不需要處理如此大量的數據,通常一次只能測試最多40-50個Excel文件。

謝謝。

+0

請注意:如果你在Fx4上查看EnumerateFiles而不是GetFiles – 2011-05-05 12:14:15

回答

2

我會離開GC到其業務。對於GC來說,10,000個對象並不是很有用。 GC工作的成本很可能遠低於Excel工作的成本。所以將你的設計複雜化爲調整GC的東西並不值得。如果最終有太多的文件需要處理,以至於應用程序無法及時完成,那很可能是Excel處理的速度讓你感到擔憂。

但是可能相關的一個註釋:如果DocumentParser在使用Excel文件工作時使用非託管內存,則可以使用GC.Add/RemoveMemoryPressure向GC指示打開文件時的實際添加成本。如果您沒有自己編寫DocumentParser,作者可能已經在執行此操作。

這裏的問題是,你可能有一個管理對象,在100個字節的順序,當它的Excel工作當中分配了大量的非託管內存的有成本的。 GC將無法知道這一點,所以這些方法有助於通知GC存在比它意識到的更多的內存壓力。這可能會改變它在決定採集時的方式/行爲,這可能會導致應用程序維持較低的內存佔用量。如果應用程序的內存使用量隨着時間的推移而逐漸消失,那麼您可能會開始看到從垃圾收集長度和可能在機器上分頁的一些緩慢下降(取決於您擁有多少內存)。您需要密切關注其內存使用情況,以確保內存在處理時不會泄漏內存 - 內存分析器可能對此有所幫助。

1

您不需要手動調用GC,除非您持有一些非常大的資源,但情況並非如此。 GC會隨着每次通話調整自己,如果你手動調用它,你只會破壞它的內部分析數據。

順便說一句,GC不僅可以收集東西,當它超出範圍時,也可以在最後一次使用後收集東西(即,它仍然在範圍內但變量不再使用)。

4

GC是一個非常複雜的軟件。而GC至少是唯一知道何時需要垃圾回收的人。所以我的建議是讓GC獨立。

此外:GC將處理這些質量對象。也許你會認識到性能下降。如果這是一個問題,你可以嘗試優化你的代碼。但不過早。

+1

+1不成熟的優化是許多惡魔的根源! – 2011-05-05 11:10:59

1

是和否 - GC在需要時足以有效釋放,但通常無法確定。

有一種方法可以強制GC採集,但在生產代碼中通常被認爲是不好的做法,因爲在不需要時強制執行堆棧遍歷的效果會更差,直到GC決定使用一點額外內存它需要釋放資源來分配更多的對象。

+0

很久以前我在Slashdot上寫過這篇文章:http://developers.slashdot.org/comments.pl?sid=363691&cid=21389893 – 2011-05-05 11:17:19