2009-04-13 80 views
1

我正在創建一個Windows控制檯應用程序,它將逐行讀取文本文件,並從固定長度數據的字符串中提取數據。該應用程序現在編寫爲Windows應用程序,但稍後將轉換爲Windows控制檯應用程序。我注意到應用程序需要一段時間才能從讀取文本開始運行,插入到數據庫中並從數據庫中導出。多線程或不

如果我使用多線程,它可以幫助加快進程嗎?我想一個線程讀取數據,另一個線程將數據插入數據庫。

有什麼建議嗎?

編輯:應用程序會在VB.net

回答

1

這是不可能的,一般說做 - 找出的唯一途徑是構建應用程序和測試性能。瓶頸可能是數據庫插入,但多線程是否會加速依賴於多種因素:

  • 是你的應用程序和運行在同一臺機器上的數據庫服務器?
  • 他們使用相同的磁盤嗎?
  • 可以插入一個引起與另一個爭用?

你明白了。話雖如此,我已經在金融行業編寫了服務器,其中對數據庫訪問進行多線程確實產生了巨大的影響。但是他們正在與一個巨大的Sun企業服務器進行交流,這個企業服務器有數據庫I/O需要備用,所以用一個多線程應用程序的請求充斥它是有道理的。

1

對於多線程,您可能會得到一些重疊 - 一個線程正在從磁盤讀取數據,而另一個線程正在執行數據庫插入。我猜你可能不會看到那麼大的改進 - 除非你正在閱讀非常大的文件,大部分時間可能花費在數據庫中,而磁盤I/O中的時間只是噪音。

0

你可能不會從中獲益太多,因爲你在這裏概述的任務本質上是非常連續的。

-1

你用什麼來構建Windows應用程序?如果您使用.Net使用線程池。 Jeff Richter開發了一個名爲Power threading的好庫。 Download

此外,瞭解線程如何在Windows操作系統中工作。有時添加多個線程可能沒有幫助,我經常不鼓勵它。

0

在構建應用程序之前,您不知道多線程是否會有所幫助,但看起來您只是想要更好的性能。在做任何事情之前,您需要測量應用程序的性能。也許有一些代碼效率低下,所以使用分析器來確定瓶頸。

0

多個線程並不總是提高性能。如果這些活動可以真正並行執行,那麼只有基本的多線程才能工作。如果在讀取數據時正在進行大量的IO操作,那麼值得一試。最好的方法是進行原型和驗證。

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; 
+0

你能給我一些關於如何處理項目的更多細節?教程或例子會很棒。順便說一句,我正在使用Microsoft企業庫來插入數據。謝謝。 – Jack 2009-04-13 16:37:33

1

將數據分組到數據庫是一項耗時的操作。嘗試批量收集項目(比如1000),並將這些批次提交給數據庫,而不是逐個提交項目。這應該會改善你的表現。對於這種類型的應用程序來說,多線程是矯枉過正的。