通过大型数据表优化循环

时间:2012-10-11 10:37:55

标签: c# asp.net

我希望数据表有100到10000行,通过doyble循环比较每一行。

for (int i = 0; i < DT1.Rows.Count; i++)
{
    for (int j = 0; j < DT1.Rows.Count; j++)
    {
        //some code to compare data
    }
}

对于100-200行,它在几分钟内完成,这没关系,但比较几千行到几千行,需要几个小时才能完成。

我该怎么做才能加快速度?我最好的想法是使用对象列表而不是数据表。

还有其他任何消息吗?

可以使用线程来执行此操作吗?

感谢。

6 个答案:

答案 0 :(得分:4)

我最近遇到了一个类似的情况,我不得不解决这个问题。虽然在我的情况下,我正在比较一对excel文件。对于我的试运行,在它运行之后,我在一侧有530行,在另一侧有459000在嵌套循环中。这大约是2.34亿次迭代。我的程序能够在大约30秒内完成它。在这种情况下我使用了foreach:

foreach (DataRow r1 in DT1.Rows) //Loop the First Source data
{
    foreach (DataRow r2 in DT2.Rows) //Loop the Second Source data
    {
         //Comparison code here...
    }
}

编辑:在循环中,作为参考点,您在循环的每次迭代中跟踪3个变量,第一个和第二个是您的计数器。第三个是主要的性能影响,DT1.Rows.Count。通过使用直接行计数作为循环的一部分,必须在每次迭代时重新计算它。这会给程序增加不必要的时间。如果你绝对要求有计数器,那么首先分配行计数:

int DT1Count = DT1.Rows.Count;
for (int i = 0; i < DT1Count; i++)
{
    for (int j = 0; j < DT1Count; j++)
    {
        //some code to compare data
    }
}

这样,行计数是静态的,并且应该删除在每次迭代时评估行计数所需的额外处理。

答案 1 :(得分:1)

尽管您可以通过使用哈希表来优化搜索,但最佳优化是让数据库引擎搜索您。 RDBMS引擎针对此类任务进行了优化 - 没有客户端优化应该能够击败它。您最大的缺点是必须将数据从数据库中提取到您的程序中。这很慢。数据库引擎拥有所有数据 - 这是一个巨大的优势。

例如,如果您要查找表示具有相同名字和姓氏的用户的行,则使用自联接的简单查询将在几秒钟而不是分钟内获得结果,因为数据永远不会离开引擎。

select u1.userId, u2.userId
from User u1
join User u2 on u1.FirstName=u2.FirstName and u1.LastName=u2.LastName

假设FirstNameLastName列已编入索引,此查询会发现您很快就会重复。

答案 2 :(得分:0)

如果结果按某种顺序排序,您可以将结果放入数组并使用二进制搜索循环

答案 3 :(得分:0)

这里要做的最大优化如下:
目前,您要比较每个值两次。例如,在循环的第一次迭代中,您将第一行与其自身进行比较,因为两个循环都从索引0开始。

最简单的解决方法是将内循环更改为:

for (int j = i + 1; j < DT1.Rows.Count; j++)

这将大大减少比较次数。您的算法目前需要进行n^2次比较。建议的修复程序将此数量减少到不到一半。通过此修复,您只需进行(n^2 - n) / 2次比较。

答案 4 :(得分:0)

    for (int i = 0; i < DT1.Rows.Count; i++)
    {
      for (int j = i+1; j < DT1.Rows.Count; j++) //<-- starts from next row
      {
        //some code to compare data
      }
    }

答案 5 :(得分:0)

你还可以指望.NET内部工作比使用手动循环做得更好:

DataTable.Select(filterExpression, sortExpression)