2011-12-21 6 views
0

私は自分の会社の顧客インデックスプログラムを作成していますが、基本的にはすべてのコード化と作業を除いてインデックス作成プログラムでユーザー指定のインデックスディレクトリを監視し、頻繁にインデックスを作成する必要がなくなります。FileSystemWatcher WPFアプリケーションでの落ち込みとSQLite

私は基本的なSQLiteデータベースを使ってWPF/C#のすべてをコーディングしていますが、フォルダウォッチャーは "非重い負荷"下でうまくいくはずですが、問題はTortoiseSVNを使用し、 FileSystemWatcherとSQLiteのアップデートで重大なファイルロードが発生するなど、(最大バッファサイズの場合でも)追いつくことができません。基本的には、ウォッチャーイベントが発生するたびにデータベースを挿入しています。

だから私の主な質問は、誰もこのような重い負荷を処理するためにこのファイルウォッチャーを実装する方法の提案はありますか?

いくつかの考えがありました:(1)すべてのクエリのステージングコレクションを作成し、後でデータを挿入するためのタイマーとスレッドを使用する(2)クエリをファイルに書き込み、後でタイマースレッドを使用する挿入

ヘルプ....

答えて

0

最も簡単な更新を持つことであるタイマー(たとえば、1分)キックオフ。他のアップデートがその間に来たら、変更を待ち行列に入れてタイマーを再起動します。アクティビティなしで1分が経過した場合にのみ処理を開始します。

+0

(これはもちろん、あなたのシステムの大幅なアイドル時間がある場合にのみ動作しますが、注意してください) – Stu

1

ファイルウォッチイベントから受信したデータをメモリにバッファリングする必要があります。したがって、登録されたファイルウォッチャーからイベントを受け取ると、できるだけ早くアクティビティのバーストをメモリに蓄積することができます。その後、別のプロセスやスレッドで、メモリバッファから読み込み、永続的なストレージに必要なものを実行したり、時間のかかる処理を実行したりします。

1

キューを使用して、すべての要求をキューに入れることができます。私は、MS MessageQueueを使って良い経験をしてくれました。これは、すぐに使えるもので、使いやすいものです。

は、キューからの要素の所定数をつかみ、データベースにそれらを挿入する別WorkerThreadを有するhttp://www.c-sharpcorner.com/UploadFile/rajkpt/101262007012217AM/1.aspx

参照します。ここでは、単一の挿入をバルク挿入にマージすることを提案します。 100%確実にするには、挿入を行う前にCPUとIOのパフォーマンスを確認できます。 ここではCPU使用率を決定するためのコードスニペット:

Process.TotalProcessorTime.TotalMilliseconds/Environment.ProcessorCount 
関連する問題