2017-06-05 51 views
-1

我首次將表中的數據填充到列表中,然後清除列表以從不同的表中選擇不同的數據,所以我想要第一個列表將從內存中釋放,因爲我將獲得越來越多的新數據。使用ado.net檢索700k條記錄時出現「System.OutOfMemoryException」C#

我曾嘗試:

List.Dispose(); 
List.Clear(); 
List = null; 
GC.Collect(); 

但記憶保持完整。

在實體框架我理解了它,並添加了.AsNoTracking()和它的工作和存儲器被清除

但我必須使用ADO.Net。

+4

我沒有看到問題。 –

+0

嘗試添加GC.WaitForPendingFinalizers()之後收集nmethod –

+0

700K記錄在內存中......試圖想到...爲什麼你需要這個? – Reniuz

回答

7

你不能告訴GC該怎麼做。 GC發佈了GC想要發佈的內容。當你處於記憶力的壓力下時,通常是非常好的;如果它不能版本,那麼我懷疑這些對象可能仍然可以訪問。特別是,事件是人們意外地保持大量對象可達的非常常見的方式 - 因此您可能需要檢查是否沒有任何懸掛事件。

還有是試圖影響GC的方法,但這樣做幾乎總是一個錯誤,我不打算在這裏包含voodoo命令,因爲我認爲這不是解決方法。

ADO.NET 不是責怪這裏; EF在 ADO.NET之上運行。請注意,你可以做的是避免列表;您可以將數據作爲序列讀取,而不需要需要它進入列表,但只需通過閱讀器工作即可。或者如果你使用像「dapper」這樣的工具(在ADO.NET之上的一個非常簡單的幫助器),你可以使用.Query<T>(...., buffered: false)(默認情況下它是緩衝區,因爲通常人們沒有讀取700,000行)。

關於列表主題:請注意,大型列表碰到「大型對象堆」,這會影響集合更多。

相關問題