0

私はこれについてコミュニティの視点を得たいと思っています。DB/IO に大きく依存するプロセスがある場合、Task Parallel ライブラリを使用して個々のプロセス パスを並列化するのはどの程度賢明でしょうか?

例を使用します...アイテムがたくさんあり、次の操作を行う必要がある場合

  1. 項目のリストについて DB にクエリを実行する
  2. パラメータの動的リストに基づいて特定の項目をグループ化するために、いくつかの集計操作を実行します。
  3. グループ化された結果ごとに、集計結果に基づいてデータベースにクエリを実行します。
  4. グループ化された結果ごとに、いくつかの数値計算を行います (3 と 4 が順番に行われます)。
  5. #3 で計算した結果に対していくつかの挿入と更新を行います
  6. #1で返された各アイテムに対していくつかの挿入と更新を行います

論理的に言えば、ステップ 3、5、6 でタスクのグラフに並列化できます。これは、1 つの項目が前の結果に影響を与えないためです。ただし、これらはそれぞれデータベース (SQL サーバー) で待機しますが、これは問題なく、SQL サーバーが許可する範囲でしか処理できないことを理解しています。

しかし、ローカル マシン上でタスクを論理的に分散させて、データベースが処理するのと同じくらい速く処理できるようにしたいと考えています。私は、db 呼び出しを Thread.Sleeps に置き換えたモック プロトタイプをいくつか作成しました (.SpinWait を使用していくつかのバリエーションも試しましたが、これは 100 万倍高速でした)。並列バージョンは、完全にシリアルである現在の実装よりもずっと高速です。まったく平行ではありません。

私が恐れているのは、SQL サーバーに過度の負担をかけることです...この道を進みすぎる前に、考慮すべき考慮事項はありますか?

4

2 に答える 2

2

パラレルバージョンがシリアルバージョンよりもはるかに高速である場合、SQLサーバーの負担について心配する必要はありません...もちろん、実行しているタスクが、他の重要な操作やタイムクリティカルな操作と比較して優先度が低い場合を除きます。 DBサーバーで実行されます。

あなたのタスクの説明は私にはよく理解されていませんが、それらのタスクの多くはデータベースで直接実行されるべきだったようです(それを不可能にする詳細があると思いますか?)

于 2010-11-19T17:30:04.680 に答える
1

もう 1 つのオプションは、2 番目のグループのステップ 3 が最初のグループのステップ 4 と同時に発生するように、パイプラインを作成することです。また、ステップ 5 で更新を重ねることができる場合は、それも行います。そうすれば、同時 SQL アクセスと処理を行うことができますが、一度に実行される同時操作は 2 つだけなので、データベースに過度の負担をかけることはありません。

したがって、ステップ 1 と 2 を順番に実行して (おそらく)、さらに処理が必要なグループのコレクションを取得します。それで。メインスレッドが開始します:

for each group
  query the database
  place the results of the query into the calc queue

2 番目のスレッドが結果キューを処理します。

while not end of data
  Dequeue result from calc queue
  Do numeric calculations
  place the results of the query into the update queue

3 番目のスレッドが更新キューを処理します。

while not end of data
  Dequeue result from update queue
  Update database

System.Collections.Concurrent.BlockingCollection<T>、このような場合に非常に効果的なキューです。

ここでの利点は、複数の計算スレッドを追加したり、SQL Server がより多くの同時トランザクションを処理できる場合にクエリ/更新スレッドを追加したりして、必要に応じてスケーリングできることです。

私は毎日のマージ/更新プログラムでこれと非常によく似たものを使用しており、非常に良い結果が得られています。その特定のプロセスは SQL サーバーを使用せず、標準のファイル I/O を使用しますが、概念は非常にうまく変換されます。

于 2010-11-19T18:33:25.013 に答える