[英]Optimize looping through large datatable
我用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行,它可以在几分钟内完成,这是可以的,但是将几千行与几千行进行比较需要花费数小时,而且还没有完成。
我该怎么做才能加快速度? 我最好想到的是使用对象列表,而不是数据表。
还有其他建议吗?
可以使用线程来做到这一点吗?
谢谢。
最近,我遇到了必须解决的类似情况。 尽管就我而言,我正在比较一对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
}
}
这样,行计数是静态的,并且将消除在每次迭代时评估行计数所需的额外处理。
尽管您当然可以使用哈希表来优化搜索,但是最好的优化方法是让数据库引擎为您搜索。 RDBMS引擎针对此类任务进行了优化-任何客户端优化都不能胜过它。 您最大的缺点是必须将数据库中的数据提取到程序中。 这很慢。 数据库引擎在那里拥有所有数据-这是一个巨大的优势。
例如,如果您要查找代表用户具有相同名字和姓氏的行,那么具有自联接的简单查询将使您在几秒钟而不是几分钟内得到结果,因为数据永远不会离开引擎。
select u1.userId, u2.userId
from User u1
join User u2 on u1.FirstName=u2.FirstName and u1.LastName=u2.LastName
假设已为FirstName
和LastName
列建立索引,此查询将非常快速地发现您重复项。
如果结果按某种顺序排序,则可以将结果放入数组中并使用二进制搜索循环
这里要进行的最大优化如下:
当前,您正在两次比较每个值。 例如,在循环的第一次迭代中,您正在将第一行与其自身进行比较,因为两个循环都从索引0开始。
最简单的解决方法是将内部循环更改为此:
for (int j = i + 1; j < DT1.Rows.Count; j++)
这将大大减少比较次数。 您的算法当前需要n^2
比较。 拟议的解决方案将此数字减少到一半以下。 使用此修复程序,您只需要(n^2 - n) / 2
比较。
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
}
}
您还可以依靠.NET内部结构,比使用以下方法进行手动循环做得更好:
DataTable.Select(filterExpression, sortExpression)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.