Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net ADODB.Connection上的最大同时连接数?_Vb.net_Multithreading_Ms Access_Adodb - Fatal编程技术网

Vb.net ADODB.Connection上的最大同时连接数?

Vb.net ADODB.Connection上的最大同时连接数?,vb.net,multithreading,ms-access,adodb,Vb.net,Multithreading,Ms Access,Adodb,我计划每10秒下载1400只股票的股价。下载非常完美,只需要几毫秒 下一步是每10秒将1400条记录写入1400个单独的mdb文件(即每个mdb文件使用1个adodb.connection)。我试图通过使用多线程(不超过CPU线程数)来提高性能,每个线程负责一些连接 我很快意识到性能并没有像预期的那样提高(更多的线程并不能提高性能),CPU负载也不会随着线程的增加而增加, 这表明瓶颈在adodb.connection对象中。然而, 通过交替使用2个单独的连接字符串(不同的提供程序),性能得到了提

我计划每10秒下载1400只股票的股价。下载非常完美,只需要几毫秒

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

我很快意识到性能并没有像预期的那样提高(更多的线程并不能提高性能),CPU负载也不会随着线程的增加而增加, 这表明瓶颈在adodb.connection对象中。然而, 通过交替使用2个单独的连接字符串(不同的提供程序),性能得到了提高,如下所示

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

Provider=Microsoft.JET.OLEDB.4.0;Data Source=xxx
我还尝试将线程转换成compliated.exe文件,并同时使用多个实例调用它们(即12个实例,12个CPU线程),性能显著提高 (随着实例的增加,CPU负载开始达到最大值)

这是供应商在整个过程中的瓶颈吗

或者是否有适当的方法“复制”提供程序,以便提高性能

我不希望程序以调用.exe的方式执行,这似乎很难管理

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

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


有没有办法增加64连接限制?

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

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

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

但是,以上所有步骤都不是您的代码!以上所有操作都是由操作系统完成的,您的代码所能做的就是等待并等待以上所有操作完成。因为上面所说的意思是使用文件系统,那么您的代码将等待很长一段时间。因此,您可能需要等待目录信息和各种要加载的内容。这些事情需要很多时间。因此,CPU将等待输入/输出,等待加载文件目录,然后扫描它们。因此,一切都成为输入/输出(I/O)绑定,而不是处理器绑定。因此,您将看到非常低的CPU使用率,因为实际上所有东西都在等待文件打开和加载。打开并获取文件句柄以及开始数据流入access数据库的时间?好吧,几年前我做过一些基准测试。大约有100000条数据流记录。换句话说,如果数据库已经打开,并且您希望保存100000行数据,那么打开一个数据库文件的时间大约是相同的

那么,如果你打开10个数据库?好吧,如果您已经打开了一个数据库,那么您可以在同一时间将100万行数据写入一个数据库!!现在,有了更好的操作系统和文件系统,多核

那么100000行数据=打开一个数据库文件规则?情况可能已经改变,情况可能会好得多。但是我们仍然需要至少10000行数据写入一个表,因为打开一个数据库的成本和时间是相同的

您当然可以在启动时打开1400个文件(数据库)。然而,我不得不认为这里使用的设计和方法有一些严重的错误。总体目标一点也不清楚,但1400个数据库似乎不是一个可行的解决方案,在这个问题上投入更多的CPU和更多的线程将不会产生多少可行的解决方案。虽然您可能会得到1400个线程,但操作系统文件系统将提示这些请求,并以一种不太并行的方式处理它们

更糟?access datbase引擎(ACE/JET)的代码已使用30多年。它不是托管代码,当然也不是线程代码。但是,如果你在打开的文件中创建1400个单独的instsnc,那么它们应该很好地发挥作用,但是共享连接对象等将不起作用。因此,您需要1400个独立的连接对象,并打开1400个sperate文件。那么,如果您构建一个类,创建1400个实例,然后将每个实例作为独立于.net的线程启动?这应该是可行的,但如前所述,对于6个内核,您只能同时运行6个实际线程并处理此问题。而这些线程中的每一个都会受到操作系统的瓶颈制约,操作系统会设置文件打开和文件管理部分。我不知道windows(比如说版本10)允许多少文件线程,但是如果你设法打开1400个文件,文件系统仍然会是一个巨大的瓶颈

正如我所说的,打开一个数据库的成本至少是将10000行数据流到一个已经打开的数据库中准备好进行数据流的成本

因此,除非您打算在开始时打开1400个文件,否则从性能的角度来看,在这个过程中打开这么多文件是不可能的——这必须是一次性交易

你真的需要打开一个数据库文件,里面有1个