簡體   English   中英

C#優化內存使用:如何釋放DataTable要求的內存

[英]C# optimize memory usage: How to free memory claimed by DataTable

目前,我正在優化大型批處理程序的內存使用情況。 最多的內存由不同的數據表使用。 例如,我的DataTable dataTable使用大約260MB。

就像線程接受的答案中的建議“ 在.NET DataTable中存儲數據的內存開銷是多少? ”,我正在嘗試將相關數據移出DataTable。 這是我的代碼:

GC.Collect(); // force the garbage collector to free memory
// First stop point - Total process memory (taskmanager) = 900 MB
List<ExpandoObject> expandoList = new List<ExpandoObject>();
foreach (DataRow dataRow in dataTable.Rows)
{
    dynamic expandoItem = new ExpandoObject();
    expandoItem.FieldName = dataRow["FieldName"].ToString();
    expandoList.Add(expandoItem);
}
// Second stop point - Total process memory (taskmanager) = 1055 MB
dataTable.Clear();
dataTable.Dispose();
dataTable = null;
GC.Collect(); // force the garbage collector to free memory
// Third stop point - Total process memory (taskmanager) = 1081 MB (wtf? even more!)

我正在使用Clear,Dispose並將其設置為null,因為在以下線程中建議這樣做Datatable.Dispose()會將其從內存中刪除嗎?

請參閱停止點注釋以查看該點的內存使用情況。 我也嘗試using (DataTable dataTable = ...)但是結果是相同的。

我究竟做錯了什么? 也許有更好的方法來減少DataTable中的數據?

我終於找到了有關內存使用的線程: .NET EXE內存占用量

接受的答案如下:

TaskManager不應用於衡量.NET應用程序的內存占用。

當.NET應用程序啟動時,它會請求操作系統提供一塊內存,然后將其分段以成為托管堆,堆棧和大對象堆。 TaskManager報告的就是這塊內存,.NET可能會完全使用它,也可能不會完全使用它。 一旦為.NET應用程序分配了一塊內存,它就不會釋放它,除非得到操作系統的要求,這只有在操作系統確定需要更多的內存資源時才會發生。

如果要測量內存分配,則需要查看各種性能>監視器(PerfMon)計數器。

簡而言之:任務管理器顯示保留的內存而不是實際使用的內存。 這意味着將DataTable設置為null可以正常工作。

可以使用GarbageCollector通過以下代碼獲取實際使用的內存:

long memoryInMB = GC.GetTotalMemory(forceFullCollection: true) / 1024 / 1024;

我用我的代碼嘗試了此操作,刪除了數據表,使已使用的總內存減少了28MB。 從DataTable提取數據到另一個容器的努力並不值得:-/

我希望這可以幫助其他有相同問題的人。

有關GC,處置和完成的更多信息,請務必參考此答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM