目前我正在优化一个巨大的批处理程序的内存使用。不同的数据表使用最多的内存。例如,我的 DataTabledataTable
使用了大约 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 中的数据?