2011-07-13 31 views
1

シナリオ - データベースに膨大なデータがあります。ユーティリティはdatareaderを使用してレコードを1つずつ読み込み、txt/xmlファイルに追加します。もともと1つのレコードを読み取ってファイルに書き出すためのユーティリティー。それから、私はそれを変更して約10kのレコードを読み込んでメモリ(stringbuilder)に入れてからファイルに書き出しました。時間の短縮はすばらしかったです。DBからの読み取りとファイルへの書き込み

ファイルI/Oがボトルネックだと思います。私はさらにそれを改善したい。何らかの種類のバッファを使用し、DBから読み込んでバッファに入れるために1つのスレッドを使用し、バッファからフェッチしてFileに書き込む別のスレッドを使用することを考えます。

可能ですか?どこから始めれば? もっと良い選択肢はありますか?

+0

まず、データをどのくらい早く読み取ることができますか、そしてデータをどのくらい速く書き込むことができますか?あなたの現在のスループットは? – Arafangion

+0

約400万レコード - 1レコードを読む、ファイルに書き込む(6時間を取る)、10kレコードを読む、ファイルに書き込む(1時間40分)、20kレコードを読む、ファイルに書き込むmin 50s) – EagerToLearn

+0

レコードの2倍の読み込み速度が大幅に遅くなりました。そこには大きなセットアップコストが必要です。 – Arafangion

答えて

0

開始点は2つのバッファを使用し、バッファ内容をファイルに非同期で書き込みます。何かのように:

buffera 
bufferb 
currentbuffer=buffera 

fill currentbuffer with data 
kickoff job to write currentbuffer to file 
wait for previous write job to finish, if relevant.  
currentbuffer=otherbuffer 

完了するまで繰り返します。

+0

これは、複数のスレッドを使用して改善できるかどうかを示すものです。もちろん、書き込みプロセスは単一のスレッドで行われなければならない(MUST)ので、wachは前のものを待たなければならない(おそらくセクションをロックする)。これを達成するのは簡単で、違いがどれほど大きいかを見てください。 –

0

パフォーマンスが本当に必要な場合は、今日のようにデータを読み込み、開始値と終了値をデータベースに渡して、複数のスレッドを使用してファイルを別々のファイルに同時に書き込むことができます。完了したら、ファイルを連結/マージ/追加します。単一のファイルへの書き込みは、データの書き込みが逐次的でなければならないため、大幅に改善することができます。

何かのような、ない、それは本当に大きなマージンによってパフォーマンスが改善されるかどうかを確認しますが、試してみる価値

using (var output = File.Create("output")) 
{ 
    foreach (var file in new[] { "file1", "file2" }) 
    { 
     using (var input = File.OpenRead(file)) 
     { 
      input.CopyTo(output); 
     } 
    } 
} 

関連する問題