【问题标题】:Improving DataTable performance提高 DataTable 性能
【发布时间】:2011-04-08 01:05:05
【问题描述】:

我有一个 DataTable 填充了 250,000 条记录和 5 列,我至少迭代了 500,000 次。

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

【问题讨论】:

  • 不迭代 500,000 次怎么样?但是发布一些你正在尝试做的代码/伪代码。否则很难提供具体的建议。盲目建议#1:让数据库完成大部分工作。
  • 为什么你需要一次在内存中的所有数据?你到底为什么要迭代它这么多次?您需要重新考虑自己在做什么,并在数据库中找到一种方法,使用面向集合的逻辑而不是迭代。

标签: c# .net performance datatable dataset


【解决方案1】:

我同意您应该有充分的理由在代码方面处理 250k 行 500k 次。发布一些伪代码和你想要完成的基本想法。

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

  1. 将 DataTable 中的每个 DataRow 读取到您创建的 POCO 对象中,并列出这些对象。 DataRows 和 DataTables 使用起来非常昂贵,因为它们被设计为处理任何行或表,因此如果您知道数据结构,它们会产生很多不需要的开销。一次性将它们拔出,然后在完成后将它们放回原处,将获得 499,999 倍的回报。

  2. 并行化进程。寻找将每次迭代拆分为 2 到 5 个工作进程的方法;比 CPU 中的内核多一个。您不会将时间分成那么多,但您会看到显着的改进。不要给迭代的每一步都赋予它自己的过程;管理它们的开销会阻塞 CPU。

【讨论】:

  • 我能不能说看到这篇文章中的人们说“我会假设你有充分的理由这样做”然后回答问题,而不是原则上拒绝回答是多么令人耳目一新,有时会发生在 SO 上。处理如此多的数据并迭代 500,000 次显然是一个极端情况,但我,用一个不太极端的用例,通过谷歌搜索 DataTable 效率来到这里,这些答案对我有帮助!
【解决方案2】:

另一种解决方案是将其转换为对象列表,很可能只是将其置于这种不同的结构上,您就可以更快地迭代

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

【讨论】:

    【解决方案3】:

    我假设您有充分的理由对列表进行 500,000 次迭代。

    根据您在每次迭代中所做的工作,您可能会从工作负载的某些并行化中受益。看看TPL,您可以使用Parallel.ForEach 将工作分解为可以并发运行的任务。这样您就可以利用具有更多 CPU 内核的更强大的硬件。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 2021-12-18
      • 2011-05-07
      相关资源
      最近更新 更多