0

1600 万のデータベース レコードを処理する必要があり、これには永遠に時間がかかります。私はスレッドに精通していないので、ここで質問したいと思いました。私の考えでは、次のことを実行する必要がありますが、方法がわかりません。

  1. 16m の記録を取得する
  2. これらをいくつかの「チャンク」に分割します
  3. これらの各チャンクをスレッド上で処理するために送信します

これは正しいと思いますか? ワークロード (16m レコード) をどのように分割しますか?

適切なアドバイスを提供できる場合は乾杯します。

4

2 に答える 2

1

アイテムのコレクションを並行して処理したい場合は、まさにそれParallel.Foreach()が目的です。各アイテムに対して実行したいアクションを渡すだけで(おそらくラムダとして)、コレクションをチャンクに分割して実行します。

ただし、そのアクションに何を入れるかについては注意が必要です。これは、コードがより多くのスレッドで同時に実行されるためです。そのため、スレッドセーフではない方法で共有状態にアクセスしないでください。

于 2012-04-04T12:49:30.583 に答える
1

よく知られたプロデューサー/コンシューマー パターンを次のように使用することをお勧めします。

  • 単一のスレッド (プロデューサー) がデータベースからレコードを取得し、タスクを作成し (単一または複数のレコードを処理する)、それらを共有キューに入れます。
  • スレッドのグループ (コンシューマー) がキューからタスクを取得し、それらを並行して処理します。

これを実装する非常に簡単な方法は、ThreadPoolクラスを使用することです。キューとワーカーを便利に管理します。必要なのは、 を介してプロデューサー タスクとキュー タスクを実装することだけですQueueUserWorkItem

Taskあるいは、TPL コンストラクトを使用する場合は、 とおそらく の組み合わせを使用して、上記のメカニズムを自分で実装できますConcurrentQueue

于 2012-04-04T12:23:11.213 に答える