2010-09-03 107 views
2

我有一个DataTable填充250,000条记录,5列,我至少迭代了500,000次。提高数据表性能

表格与1000条记录之间的性能差异很大,我可以理解并理解为什么 - 但是有没有办法提高性能?

+9

如何不迭代它500,000次?但是发布一些代码/ pseuodocode你正在尝试做什么。否则很难提供具体的建议。盲目的建议#1:让数据库完成大部分工作。 – 2010-09-03 20:30:33

+0

为什么你需要同时在内存中存储所有的数据?为什么你在世界上迭代了很多次?您需要重新思考自己在做什么,并找到一种方法在数据库中使用面向集合的逻辑来代替迭代。 – 2010-09-03 21:30:45

回答

3

我会假设你有一个很好的理由迭代列表500,000次。

根据您每次迭代所做的工作,您可能可以从某些工作负载的平行化中受益。看看TPL,你可以使用Parallel.ForEach将工作分解成可以同时运行的任务。通过这种方式,您可以利用功能更强大,硬件更多的CPU核心。

当然,如果你可以在更少的迭代中完成更多的工作,你也可以获得一些性能,但是实际上并不知道你在做什么,唯一可以提供的建议是高层次的想法,没有任何实际问题域的基础。

2

另一个解决办法是把它变成对象的名单,极有可能只是有它在这个不同的结构,你将能够迭代更快

如果你不是在每次迭代写入数据,你肯定会受益于多线程(并行化)

1

我同意你应该有一个非常好的理由在代码端处理250k行500k次。张贴一些伪代码和你想要完成的基本想法。

我现在假设你确实需要超过250k条记录500k次。也许这是一个分形系列。如果你对算法做两件相对简单的事情,我认为你会大大提高性能。

  1. 阅读DataTable中的每个DataRow的伸到你创建一个POCO对象,使它们的名单。 DataRows和DataTable的使用极为昂贵,因为它们被设计用来处理任何行或表,因此如果知道数据结构,它们会有很多开销,而这些开销并不需要。一次性把他们拉出来,然后在完成后再把它们放回去,将会收回499,999倍。

  2. 并行化过程。寻找方法将2到5个工作进程之间的每次迭代进行拆分;比你的CPU内核多一个。你不会把时间分得太多,但你会看到显着的改善。不要将迭代的每一步都放在自己的过程中;你会堵塞CPU的开销来管理它们。