0

我有一个带有 Access 数据库的 VB.net 应用程序,其中一个表包含大约 2,800,000 条记录,每个原始数据每天都会更新新数据。该机器具有 64GB 的内存和 i7 3960x,并且其超频至 4.9GHz。

注意:数据源是本地的。

我想知道如果我使用 ~10 个线程,它会更快地将数据更新到行。

如果可能的话,将这个大循环分成多个线程的机制是什么?

更新:有时循环必须根据结果重复某些行的计算,循环也有 63 个条件及其 242 行代码。

4

3 回答 3

2

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

您的任务需要进行的计算越多,您通常会从并发/线程中受益越多。如果您启动 10 个线程,这些线程只向 Access 发送更新命令,它不太可能比仅使用一个线程快得多。

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

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

  • 一个线程从 Access 读取数据
  • 一个线程对您读取的数据执行所需的任何计算
  • 一个线程更新Access

您可以使用生产者/消费者模式来实现这一点,使用BlockingCollection很容易做到这一点。

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

补充思想

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

于 2012-08-10T17:11:50.207 回答
0

好吧,如果您使用 2,800,000 个查询更新 2,800,000 条记录,那肯定会很慢。

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

您可能想向我们展示一些您当前如何操作的代码,以便我们可以告诉您要更改的内容。

所以我不认为(根据您提供的信息)为此使用多线程会更快。现在,如果您正在考虑使用多线程,因为更新冻结了您的 GUI,现在这是另一回事了。

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

于 2012-08-10T17:07:15.400 回答
0

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

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

于 2012-08-10T17:11:02.547 回答