2012-08-10 30 views
0

我有一个Access数据库的VB.net应用程序,其中一个表包含约2,800,000条记录,每个原始数据每天都用新数据更新。该机器具有64GB的RAM和i7 3960x,其超频速度达到4.9GHz。更新2 800 000条记录和4个线程

注意:数据源是本地的。

我不知道如果我用〜10个线程将它完成更新的数据行越快。

如果possiable会是什么deviding这个大循环,多线程的机理探讨?

更新:有时循环有重复计算根据结果一些行也环路有exacly 63的条件和其242行代码。

+2

瓶颈可能不是处理能力,但IO - 在这种情况下,添加线程只会由于同步开销而降低速度。 – Oded 2012-08-10 17:06:04

+0

所以没有办法让它更快? – user1590636 2012-08-10 17:07:51

+0

@ user1590636增加IO吞吐量。 SSD肯定会有所帮助。 – vcsjones 2012-08-10 17:12:43

回答

2

与其他数据库平台相比,Microsoft Access并不擅长处理许多并发更新。

您的任务需要执行的计算越多,您通常会从并发/线程获益越多。如果你启动了10个线程,而不仅仅是发送更新命令到Access,那么它不可能比只有一个线程的速度快得多。

如果您必须在读取和写入数据之间进行任何重要计算,则线程可能会显示性能改进。

我建议尝试以下测量结果:

  • 一个线程从Access中读取数据
  • 一个线程来执行任何计算所需的数据,你读
  • 一个线程更新访问

您可以使用生产者/消费者模式实现此操作,这与BlockingCollection相当容易完成。

有关生产者/消费者模式的好处是,您可以添加更多的生产者和/或消费者线程,并以最少的代码更改来找到最佳位置。

补充思想

IO可能是您的应用程序的瓶颈。考虑将Access文件放置在更快的存储上(如果可以的话)(SSD,RAID或甚至RAM磁盘)。

+0

如果我使用RamDisk,则RamDisk会产生影响我已经在使用SSD,多线程会在RAM磁盘上做出改变吗? – user1590636 2012-08-10 17:18:32

+0

是的,绝对。我有一个现代(快速)的SSD,最近将一个SQL Server 2008 R2 .mdf文件移动到一个RAM磁盘上,几乎是两倍的速度。 – 2012-08-10 17:19:34

+0

如果您需要RAM磁盘软件建议,由于其灵活性,我使用http://www.romexsoftware.com/en-us/primo-ramdisk/index.html。 – 2012-08-10 17:20:51

0

那么如果你用2,800,000个查询更新2,800,000条记录,它肯定会很慢。

通常,最好避免打开多个连接来更新数据。

您可能希望向我们展示你是如何正在做它的一些代码,所以我们可以告诉你要改变什么。

所以我不认为(你给了信息)要多线程这会更快。现在,如果您考虑进行多线程,因为更新会冻结您的GUI,那么现在就是另一回事了。

如果处理速度很慢,我个人不认为这是由于您的服务器规格。我猜想这更多的是关于你用来更新数据的逻辑。

+0

有22列,我只是做计算和更改数据表,计算是非常基本的,但我想知道是否将数据库分解为多个数据表,然后使每个线程更新一个表,然后在完成所有线程时合并他的表... – user1590636 2012-08-10 17:11:53

+0

不,我已经使用后台工作器,所以GUI不冻结 – user1590636 2012-08-10 17:12:38

0

不要怀疑,测试。编写它,以便您可以派发尽可能多的线程来完成工作并使用各种线程进行测试。你说的循环是什么样的?

像“如果我添加更多的线程,它会工作更快”的问题?尽管有经验法则,但总是最好测试。如果数据库是本地的,那么Oded的可能性是正确的。

+0

The循环使用新的数字数据更新列号4至13,然后对新数据进行一些计算,并填充列中的结果,然后根据结果对数据网格中的行进行着色 – user1590636 2012-08-10 17:17:38