ADODB上的最大同时连接数。连接?

问题描述 投票:0回答:1

我计划每10秒下载1400股的股价。下载是完美的,只消耗几毫秒。

下一步是每10秒将1400条记录写入1400个单独的mdb文件(即,使用1个adodb.connection的每个mdb文件)。我试图通过使用多个线程(不超过CPU线程数)来完成这项工作,每个线程负责某些连接,以提高性能。

仅让我意识到性能并未达到预期的提高(更多线程无法提高性能),并且CPU负载不会随着更多线程而增加,这表明瓶颈在adodb.connection对象中。然而,通过交替使用2个单独的连接字符串(不同的提供程序)来提高性能,如下所示。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=xxx

Provider=Microsoft.JET.OLEDB.4.0;Data Source=xxx

[我还试图将线程放入编译的.exe文件中,并同时使用多个实例(即12个实例和12个线程CPU)调用它们,并且性能得到了显着提高(并且随着实例的增加,CPU负载开始达到最大)]

提供者是否在整个过程中都是瓶颈?

或者是否有适当的方法来“复制”提供者,从而可以提高性能?

我不希望程序通过调用似乎难以管理的.exe来执行。

我还注意到,VB.net项目中的同时连接总数不能超过64,否则将弹出错误消息:

运行时错误-2147467259(80004005)自动化错误,未指定的错误

是否可以增加64个连接限制?

vb.net multithreading ms-access adodb
1个回答
0
投票

您应该能够将每个任务作为.net中的单独线程启动。真正的问题是,当您尝试使用6个内核重载代码时,您只会得到6倍的增长。主要瓶颈?即使您要让所有6个核心都运行thead?您可能只会看到处理器使用量的一小部分!但是为什么呢?

嗯,虽然.net(甚至VBA)每秒可以轻松执行十亿条指令?那么问题就变成了打开文件的大量时间。

如果您打开文件?然后,操作系统在这里发挥了重要作用。操作系统将检查权限。操作系统检查文件是否存在。然后,它检查是否有人打开它。然后,病毒软件可能会扫描文件或执行其他操作。然后Access中的ACE / JET数据引擎开始工作。它检查是否有人打开(如果是,则以多用户模式打开文件)如果不是多用户模式,请打开文件以供单用户高速使用。现在,我可以在此处再插入约100多个步骤。

但是,以上所有步骤都不是您的代码!以上所有事情都是由OS发生和完成的-您可以完成的所有代码就是WAIT和WAIT。因为上面的内容意味着您正在使用文件系统,所以您的代码将坐下来等待很长时间。结果,您正在等待目录信息和所有内容的加载。这些事情需要很多时间。因此,CPU将等待输入/输出,并等待文件目录加载,然后对其进行扫描。因此,一切都变成了输入/输出(I / O)约束,而不是处理器约束。结果,您将看到非常低的CPU使用率百分比,因为实际上所有事情都在花时间等待文件打开和加载。是什么时候打开并获取文件句柄并开始将数据流入Access数据库?好吧,几年前我做了一些基准测试。它大约有100,000条数据流记录。换句话说,如果已经打开数据库并且您要保存100,000行数据,则打开一个数据库文件的时间大约是同一时间!

所以,如果您打开10个数据库?好吧,如果您已经打开过一次,则可以在同一时间将100万行数据写到一个数据库中!现在,有了更好的操作系统和文件系统,多核了吗?

100,000条数据行=打开一个数据库文件规则?它可能已经改变了,情况可能会好得多。但是我们仍然要向表中写入至少10,000行数据,因为打开一个数据库需要花费相同的时间和金钱!]

您当然可以在启动时打开1400个文件(数据库)。但是,我必须认为这里使用的设计和方法存在严重错误。完全没有实现总体目标,但是1400个数据库似乎不是一个可行的解决方案,并且会抛出更多的CPU,并且更多线程化处理此问题不会带来很多可行的解决方案。虽然您可能获得1400个线程,但OS文件系统将提示这些请求并以不太出色的并行方式处理它们。

更糟吗?访问数据库引擎(ACE / JET)的代码已有30多年的历史了。它不是托管代码,当然也不是线程代码。但是,如果您创建了1400个单独的文件打开实例,则它们应该可以正常播放,但是无法共享连接对象等。因此,您需要1400个单独的连接对象,然后打开1400个单独的文件。那么,如果您建立一个类并创建1400个实例,然后将每个实例作为与.net分开的线程启动?这应该可以工作,但是如前所述,使用6个内核,您将只能同时运行6个实际线程并解决该问题。而且这些线程中的每个线程仍将受到操作系统的瓶颈,这将查询文件打开和文件管理部分。我不知道Windows(比如说版本10)允许多少个文件线程,但是如果您设法打开1400个文件,文件系统仍然会成为瓶颈。

正如我所说,打开数据库的成本至少是将10,000行数据流到已经开放的数据库中以准备进行数据流。

因此,除非从一开始就打开1400个文件,否则从性能的角度来看,在此过程中不能打开这么多文件-必须一次性完成。

然后,您确实确实需要打开一个数据库文件,并且内部有1400个表(因为仅打开了一个文件)。

但是,还是要替换1400个文件?为什么不将一列添加到可区分1400个表的一个数据表中,现在我们一路向下到一个文件和一个表。

您必须提供更多详细信息,为什么不能在此处使用一个表。这可能是您的最佳选择和解决方案。您可以在一个数据库中考虑1400个表,但是在这里根本不建议打开1400个数据库。

© www.soinside.com 2019 - 2024. All rights reserved.