我有一个带有Access数据库的VB.net应用程序,其中一个表包含大约2,800,000条记录,每个原始数据每天都会更新为新数据。该机器具有64GB的RAM和i7 3960x,其超频时间为4.9GHz。
注意:数据源是本地的。
我想知道我是否使用~10个线程,它会更快地将数据更新到行中。
如果可能的话,将这个大循环分配给多个线程的机制是什么?
更新:有时循环必须重复某些行的计算,具体取决于结果,循环还有63条条件及其242行代码。
答案 0 :(得分:2)
与其他数据库平台相比,Microsoft Access在处理许多并发更新方面并不是特别擅长。
您的任务需要进行的计算越多,您通常会从并发/线程中获益越多。如果您启动10个线程,这些线程只是向Access发送更新命令,那么它不可能比仅使用一个线程快得多。
如果您必须在读取和写入数据之间进行任何重要计算,则线程可能会显示性能提升。
我建议尝试以下方法并测量结果:
您可以使用Producer / Consumer模式实现此功能,使用BlockingCollection非常容易。
关于Producer / Consumer模式的好处是你可以添加更多的生产者和/或消费者线程,只需最少的代码更改即可找到最佳位置。
补充思想
IO可能是您的应用程序的瓶颈。如果可以,请考虑将Access文件放在更快的存储上(SSD,RAID,甚至是RAM磁盘)。
答案 1 :(得分:0)
如果您使用2,800,000个查询更新2,800,000条记录,那肯定会很慢。
通常,最好避免打开多个连接来更新数据。
您可能希望向我们展示一些代码,了解您目前是如何做的,因此我们可以告诉您要更改的内容。
因此,我认为(使用您提供的信息)为此进行多线程会更快。现在,如果您正在考虑使用多线程,因为更新会冻结您的GUI,现在这是另一个故事。
如果处理速度很慢,我个人认为这不是由于您的服务器规格。我猜这更像是你用来更新数据的逻辑。
答案 2 :(得分:0)
不要怀疑,测试。写它,这样你就可以调度尽可能多的线程来完成工作并用不同数量的线程测试它。你说的循环是什么样的?
问题是“如果我添加更多线程,它会更快地运行”吗?虽然有拇指规则,但总是最好进行测试。如果数据库是本地的,那么Oded可能是正确的。