0

我有一个更新 2,800,000 条记录访问数据库的大循环,我将循环划分为 7 个线程,因此每个线程处理 400,000 条记录,循环需要大约 0.7 秒来更新一条记录,因为要完成很多计算。

我确信线程将有助于使进程更快,因为我在 7200RPM HDD 和 SSD 和 ramdisk 上测试了应用程序,速度差异并不明显,因此 IO 不是瓶颈。

我希望第一个线程处理前 400k 记录,第二个线程处理接下来的 400k 记录,依此类推。

- 这样做的正确方法是什么?

- 每个线程都应该有自己的数据表和绑定源吗?

-当过程完成时,您将如何将结果合并到一个表中并在 datagridview 中显示?

4

2 回答 2

1

访问数据库只是一个文件。在读写它的时候,你会遇到瓶颈,最重要的是,它很有可能在做这样的事情时被破坏。想象一下对数据的 xml 文件做同样的事情。

一切都取决于您对数据所做的工作。如果任何键或索引中的任何列都没有更改,并且并非所有记录都会读取/更改。然后一个要读写的线程和一个要处理的池可能会让你到达某个地方。该处理必须足够重要,以使其值得旋转多个线程。因为他们将在磁盘 io 上等待,除非有大量磁盘。如果您有会更改的索引并且您不必在操作中使用它们。放下它们,处理然后再放回去。

如果您正在对数据进行重大更改,那么也许

从现有数据库中读取一个线程然后创建七个(可能希望根据合理的处理器数量来调整)空数据库,其中只有这个表 从父级读取,放入处理器池(如果值得拥有一个) ,然后写入“七个”副本之一然后清除原始数据并从其他副本中写回数据(串行并重新组合在一起)

所有所说的放弃访问,请使用完整的 dbms,因为您可能已经看到了一些您所期望的改进。

并行处理时要记住的事情。瓶颈在哪里?在您的情况下,可能是磁盘 IO,多个线程没有解决这个问题,您最终得到了 7 个线程在等待磁盘驱动器。

于 2012-08-11T12:49:00.133 回答
1

我建议尝试从另一个角度来解决这个问题。遍历这么多记录并单独更改它们总是很慢。

我建议您尝试发出一次更新许多记录的更新语句,并尝试通过将其分解为逻辑语句来封装您的业务逻辑。例如:

UPDATE stock SET retail = 0.95 WHERE retail  < 1.5
UPDATE stock SET retail = 1.95 WHERE retail >= 1.5 and retail < 2.5
UPDATE stock SET retail = 2.95 WHERE retail >= 2.5 and retail < 3.5
UPDATE stock SET retail = 3.95 WHERE retail >= 3.5 and retail < 4.5
UPDATE stock SET retail = 4.95 WHERE retail >= 4.5 and retail < 5.5

如果您可以将业务逻辑分解为单独的语句,您会发现一次更新许多记录的速度要快得多。

做不到这一点,如果可以的话,发布更多细节!

于 2012-08-13T03:08:54.080 回答