2011-11-23 8 views
1

すべて、のPerlのWin32 :: OLEの生成Accessデータベース

[説明]:私はフラットファイルと生成のリストからの読み取り、アクセスデータベースをロードしています。 Windows XP、Perl 5.8.8、およびデフォルト以外の追加モジュールへのアクセスはインストールされていません。

[Issue:s]:パフォーマンス、パフォーマンス、パフォーマンス。すべてのデータをロードするのに約20分かかります。私は、&更新を新しく追加するのではなく、データを読み込むためのよりよい方法があると仮定しています。

[ロジック]:ここに私の変換および追加ロジックの多くを掲示することなくは私がしようとしていますものです:

  1. ファイルを開くX
  2. 読み出し行0 jet-
  3. Xファイルの> 2番目の文字列から作成した文字列からCreateステートメントを実行
  4. 行を1つ読み込んでタブ区切り文字列を作成し、配列に格納
  5. レコードセットを開く配列内の各アイテムのためにテーブル名
  6. SELECT * FROMをINGの
    1. recordset-> AddNewの
    2. 分割し、分割の各項目のタブ
      1. に基づいたアイテム
        1. RS-> Fields- >項目(POS) - > {値} = item_value
    3. recordset->
    4. を更新

ありがとうございます。

+0

20分で読み込まれる行の数はいくつですか?各行にいくつの列(フィールド)がありますか?どのくらいの大きさのバイトが入力ファイルですか?読み込み中にインデックスを作成していますか? –

答えて

2

低負荷での1つの問題は、すべてのアップデートでコミットしていることです。自動コミットがオフになっていることを確認し、1000行ごとに実行するかどうかを確認します。巨大な荷物でない場合は、まったくやってはいけません。また、ロード中に索引を作成しないでください。後で索引を作成してください。

また、私はOLEがこれを行うための最善の方法であるとは確信していません。私はDBIとWin32 :: ODBCを使ってAccess dbを常時ロードしています。かなり速く進む。

リクエストごとに、サンプルロードプログラムがあり、WinXP、Access 2003、ActiveState Perl 5.8.8で1分あたり約100kレコードでした。

use strict; 
use warnings; 

use Win32::ODBC; 

$| = 1; 

my $dsn = "LinkManagerTest"; 
my $db = new Win32::ODBC($dsn) 
    or die "Connect to database $dsn failed: " . Win32::ODBC::Error(); 

my $rows_added = 0; 
my $error_code; 

while (<>) { 
    chomp; 

    print STDERR "."  unless $. % 100; 
    print STDERR " $.\n" unless $. % 5000; 

    my ($source, $source_link, $url, $site_name) = split /\t/; 

    my $insert = qq{ 
     insert into Links (
      URL, 
      SiteName, 
      Source, 
      SourceLink 
     ) 
     values (
      '$url', 
      '$site_name', 
      '$source', 
      '$source_link' 
     ) 
    }; 

    $error_code = $db->Sql($insert); 

    if ($error_code) { 
     print "\nSQL update failed on line $. with error code $error_code\n"; 
     print "SQL statement:\n$insert\n\n"; 
     print "Error:\n" . $db->Error() . "\n\n"; 
    } 
    else { 
     $rows_added++; 
    } 

    $db->Transact('SQL_COMMIT') unless $. % 1000; 
} 

$db->Transact('SQL_COMMIT'); 
$db->Close(); 

print "\n"; 
print "Lines Read: $.\n"; 
print "Rows Added: $rows_added\n"; 

exit 0; 
+0

ロードはアクセスデータベースのものよりも大きいです。私はおよそ300k行をロードしていると思います。私にあなたのdbiコードのサンプルを郵送できますか? – XanderLynn

+0

ここではどのように午後ですか?答えにコードを追加しました。 –

関連する問題