【发布时间】:2025-12-04 04:40:01
【问题描述】:
如何强制缩小 DataTable 和/或 List 以便有效地释放内存?我目前在循环的每次迭代中都从 DataSet 中删除已处理的行,但我不确定是否正在释放内存。
for (int i = m_TotalNumberOfLocalRows - 1; i >= 0; i--)
{
dr = dt.Rows[i];
// Do stuff
dt.Rows.Remove(dr);
}
如果这不能缩小 DataTable 在内存中的占用空间,我可以使用 List。我只是将 DataTable 用作 DataRows 的存储,我可以使用任何内存不足的集合或存储机制,并且能够在每 x 次迭代中释放内存。
谢谢。
编辑: 在阅读What Are Some Good .NET Profilers? 后进行一些内存分析后,我发现内存的主要消费者是字符串。
在此过程中,我们正在做大量的用户输出,内存消耗在大约 170MB-230MB 之间循环,峰值在 300MB 左右。我正在使用初始大小为 20971520 的 StringBuilder 来保存正在发生的事情的输出/日志,并且在处理完记录总数的百分之一后,我将 DevExpress MemoEdit 控件的 Text 属性设置为 StringBuilder.ToString ()。我发现这种方法比将 StringBuilder.ToString() 附加到 MemoEdit.Text 更快(显然 StringBuilder 的逻辑在附加和设置 MemoEdit.Text 之间是不同的)
我还发现,与重新创建 StringBuilder(20971520) 相比,仅使用 StringBuilder.Remove(0, StringBuilder.Length) 更容易在内存上执行和更快地执行
在处理大字符串时,您是否可以分享任何技巧来提高性能(它写出的包含日志的日志文件大约为 12.2MB,大约有 30 000 条记录)?
注意:我已经更改了问题的标题和标签。
旧标题:如何强制缩小数据表和/或列表以释放内存?
老标签:list datatable c# .net memory
【问题讨论】:
标签: c# .net string memory stringbuilder