我有一个DataTable,其中包含250,000条记录,包含5列,我正在迭代至少500,000次。
具有1000条记录的表格之间的性能差异是巨大的,我可以理解并理解为什么 - 但是有没有办法改善性能?
答案 0 :(得分:3)
我将假设您有充分的理由在列表上迭代500,000次。
根据您每次迭代所做的工作,您可能能够从工作负载的一些平行化中受益。看一下TPL,您可以使用Parallel.ForEach将工作分解为可以同时运行的任务。这样,您就可以利用功能更强大的硬件和更多CPU内核。
当然,如果你可以在更少的迭代中完成更多的工作,你也可能会获得一些性能,但是如果不知道你在做什么,可以提供的唯一建议是高层次的想法,而不依赖于实际的问题域。
答案 1 :(得分:2)
另一个解决方案是将其转换为对象列表,很可能只是通过在不同的结构上使用它可以更快地迭代
如果你没有写每次迭代的数据,你肯定会受益于多线程(并行化)
答案 2 :(得分:1)
我同意你应该有充分的理由在代码方面处理250k行500k次。发布一些伪代码和你想要完成的基本想法。
我现在假设你必须超过250k记录500k次。也许是分形系列。如果你对算法做两个相对简单的事情,我认为你会大大提高性能。
将DataTable中的每个DataRow读取到您创建的POCO对象中,并创建这些对象的列表。 DataRows和DataTables使用起来非常昂贵,因为它们旨在处理任何行或表,因此如果您了解数据结构,它们会有很多开销。将它们拉出来然后在完成后重新投入的一次性费用将被支付499,999次。
并行化流程。寻找在2到5个工作进程之间拆分每个迭代的方法;比你的CPU核心多一个。你不会把时间划分那么多,但你会看到显着的改善。不要给迭代的每一步都给它自己的过程;你将用管理它们的开销阻塞CPU。