内存泄漏使用数据表

时间:2010-05-26 06:58:14

标签: c# asp.net memory-management memory-leaks

我的情况是,我被迫每次检索30,000条记录到2个数据表。我需要做一些操作并将操作插入到Manipulate(dt1,dt2)函数中的SQL服务器中。我必须这样做你可以在for循环中看到15次。现在我想知道什么是内存使用方面的有效方法。我已经使用了第一种方法。请建议我最好的方法。

(1)

for (int i = 0; i < 15; i++)
{
  DataTable dt1 = GetInfo(i);
  DataTable dt2 = GetData(i);
  Manipulate(dt1,dt2);
}

(OR)

(2)

DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
for (int i = 0; i < 15; i++)
{
  dt1=null;
  dt2=null;
  dt1 = GetInfo();
  dt2 = GetData();
  Manipulate(dt1, dt2);
}

2 个答案:

答案 0 :(得分:1)

理论上,第一个示例更有效,因为在第二个示例中,您首先创建了两个不会被使用的DataTable对象。但是,这两个DataTable对象包含的数据很少,因此内存使用的开销很小,几乎无法测量。

尝试优化此示例以提高性能在我看来premature optimization,当然是bad thing。您应该首先寻找最易读的解决方案,并且只有在速度太慢时才进行优化。

但是,在你的情况下,第一个代码片段肯定比第二个代码片段更具可读性,因为它代码更少,变量范围更短,并且你不必将实例重置为null

答案 1 :(得分:0)

从您显示的代码中,new DataTable()调用以及再次将dt1和dt2清零的赋值语句都没有意义。您感兴趣的唯一部分是GetInfo(i)GetData(i)返回的内容。您不必使用时分配空的DataTable对象。

我很好奇你是否可以重新考虑一下你的设计。当您使用30,000条记录时,对每条记录执行多个数据库操作并不理想。我经常发现,以数据库为中心的操作造成的最大性能损失是由于我可以在一个语句中完成多个select语句。考虑到集合或批处理操作,您是否可以只执行一次或两次数据库调用来获取项目列表,并迭代它们?如果您要解决性能问题,这将是一个很好的起点。

在进行更改之前,通过输入计时代码并监视应用程序以查看实际使用的内存量来测量和验证最长时间的操作。集中精力优化最慢的部分。我希望你觉得这很有用=)我不是故意以任何方式光顾。