[英]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.