我正在创建一个Windows控制台应用程序,它将逐行读取文本文件,并从字符串中提取固定长度数据的数据。该应用程序现在编写为Windows应用程序,但稍后将转换为Windows控制台应用程序。我注意到应用程序需要一段时间才能读取文本,插入数据库并导出数据库。
如果我使用多个线程,它会帮助加快这个过程吗?我正在考虑一个线程来读取数据,另一个线程将数据插入到数据库中。
任何建议?
编辑:应用程序将在VB.net中完成
答案 0 :(得分:4)
我将假设这是一个SQL数据库。
您的问题很可能是您一次只做一件事。 SQL讨厌这个。 SQL和SQL数据库在集项上运行。
因此,打开一个交易,阅读并插入1,000个项目。保存这些项目以防由于某种原因导致事务提交失败,以便您可以重试。
我已经成功地使用这种技术加速了一些Perl脚本,这些脚本的工作听起来与您的描述类似,超过20倍。
我不知道您正在使用的Microsoft库,但这里是使用DBI的Perl示例。使它工作的部分是AutoCommit => 0和$ dbh-> commit。
#!/usr/bin/perl
use strict;
use DBI;
my $dbname = 'urls';
my $user = 'postgres';
my $pass = '';
my $dbh = DBI->connect(
"DBI:Pg:dbname=$dbname",
$user,
$pass,
{ 'RaiseError' => 1, AutoCommit => 0 }
);
my $insert = $dbh->prepare('
INSERT INTO todo (domain, path)
VALUES (?, ?)
');
my $count = 0;
while(<>) {
if( $count++ % 1000 == 0) {
$dbh->commit;
}
chomp;
my ($one, $two) = split;
$insert->execute($one, $two);
}
$dbh->commit;
$dbh->disconnect;
答案 1 :(得分:1)
一般来说,这是不可能的 - 找出答案的唯一方法是构建应用程序并测试性能。瓶颈可能是数据库插入,但多线程是否会加速依赖于许多因素:
你明白了。话虽如此,我已经在金融行业编写了服务器,其中多线程数据库访问确实产生了巨大的差异。但这些是与一个巨大的Sun企业服务器交谈,它有多余的数据库I / O,所以充满了多线程应用程序的请求是有道理的。
答案 2 :(得分:1)
使用多个线程,您可能会遇到一些重叠 - 一个线程从磁盘读取而另一个线程正在执行数据库插入。我猜你可能不会看到那么多改进 - 除非你正在阅读非常大的文件,你的大部分时间都可能花在插入数据库上,而磁盘I / O中的时间只是噪音。
答案 3 :(得分:1)
将数据汇总到数据库是一项耗时的操作。尝试批量收集项目(比如1000)并将这些批次提交到数据库,而不是逐个提交项目。这应该可以改善您的表现。多线程对于这种类型的应用来说是过度的。
答案 4 :(得分:0)
你可能不会从中获得太多收益,因为你在这里概述的任务本质上是连续的。
答案 5 :(得分:0)
在构建应用程序之前,您不会知道多线程是否会有所帮助,但您似乎真的只想要更好的性能。在做任何事情之前,您需要测量应用程序的性能。也许有些代码效率低下,因此请使用分析器来识别瓶颈。
答案 6 :(得分:0)
多个线程并不总能提高性能。如果活动可以真正并行执行,那么只有基本的多线程才能工作。如果在读取数据时正在进行大量IO操作,那么值得尝试一下。最好的方法是进行原型验证。
答案 7 :(得分:-1)
你用什么来构建Windows应用程序?如果您使用.Net使用线程池。 Jeff Richter开发了一个很好的名为Power threading的库。Download
另外,了解线程在Windows操作系统中的工作方式。添加多个线程有时可能没有帮助,我经常不鼓励它。