HTML コンテンツがバイナリ シリアル化された BLOB として格納されているデータベース テーブルがあります。コンテンツを 1 つずつ取得し、コンテンツ内の特定のキーワードを探し (そして見つかった一致を報告)、コンテンツを HTML ファイルとしてディスクに保存する必要があります。Parallel.ForEach を使用してこれを並列化できますか? これは良いアイデアですか、それとももっと良いアイデアがあります。
助けてくれてありがとう、アシッシュ
HTML コンテンツがバイナリ シリアル化された BLOB として格納されているデータベース テーブルがあります。コンテンツを 1 つずつ取得し、コンテンツ内の特定のキーワードを探し (そして見つかった一致を報告)、コンテンツを HTML ファイルとしてディスクに保存する必要があります。Parallel.ForEach を使用してこれを並列化できますか? これは良いアイデアですか、それとももっと良いアイデアがあります。
助けてくれてありがとう、アシッシュ
データベースとディスクへの I/O パフォーマンスは、プロセッサの速度よりもはるかに遅くなるため、並列化によるメリットはほとんど見られません。
1 つのクエリでデータベースから一連の行を取り出し、それぞれを並行して処理してキーワードを検索し、バッチを 1 つのステップでディスクに保存できれば、大きなメリットが得られると思います。1 つずつ選択して直線的に処理する場合、並列処理によるメリットはほとんどありません。
両方の方法を試して、違いを測定して、本当に効果があるかどうかを確認する必要があると思います. 明らかに、シングル コア マシンでは違いはありませんが、2 つのファイルのみを処理する 8 コア マシンでも、ファイルごとのキーワード検索に長い時間がかかる場合を除き、大きなメリットは見られない可能性があります。:) あなたの最善の策は、さまざまなテクニックでいくつかの異なるスパイクを試して、あなたとあなたの状況に最適なものを見つけることだと思います.
私は Producer Consumer アプローチを行います ( http://en.wikipedia.org/wiki/Producer-consumer_problem ):
1 つのスレッドがデータベースにクエリを実行し (可能であれば、1 つずつ実行できるようにある種のカーソルを使用して)、各行をバッファーに配置します。
別のスレッド (または、検索に多くの処理が必要な場合は複数のスレッド) がデータベースの 1 行を (HTML blob を使用して) 取得し、検索を処理しています。
この場合、クエリと処理を同時に行うことができます。
クエリが処理よりもはるかに長くかかる可能性が非常に高いという単一の事実によって、パフォーマンスが大幅に向上するとは思いません。問題は、クエリを実行する部分でディスクの読み取りがボトルネックになっていることです。最終的には、ディスク パフォーマンスが全体的なパフォーマンスを制限する可能性が非常に高くなります。
この方法であるかどうかを確認するには、プロデューサー/コンシューマーを複数のプロデューサー (つまり、データベースにクエリを実行する複数のスレッド) で行うことができます。
お役に立てば幸いです。
エドゥアルド