1600 万のデータベース レコードを処理する必要があり、これには永遠に時間がかかります。私はスレッドに精通していないので、ここで質問したいと思いました。私の考えでは、次のことを実行する必要がありますが、方法がわかりません。
- 16m の記録を取得する
- これらをいくつかの「チャンク」に分割します
- これらの各チャンクをスレッド上で処理するために送信します
これは正しいと思いますか? ワークロード (16m レコード) をどのように分割しますか?
適切なアドバイスを提供できる場合は乾杯します。
1600 万のデータベース レコードを処理する必要があり、これには永遠に時間がかかります。私はスレッドに精通していないので、ここで質問したいと思いました。私の考えでは、次のことを実行する必要がありますが、方法がわかりません。
これは正しいと思いますか? ワークロード (16m レコード) をどのように分割しますか?
適切なアドバイスを提供できる場合は乾杯します。
アイテムのコレクションを並行して処理したい場合は、まさにそれParallel.Foreach()
が目的です。各アイテムに対して実行したいアクションを渡すだけで(おそらくラムダとして)、コレクションをチャンクに分割して実行します。
ただし、そのアクションに何を入れるかについては注意が必要です。これは、コードがより多くのスレッドで同時に実行されるためです。そのため、スレッドセーフではない方法で共有状態にアクセスしないでください。
よく知られたプロデューサー/コンシューマー パターンを次のように使用することをお勧めします。
これを実装する非常に簡単な方法は、ThreadPool
クラスを使用することです。キューとワーカーを便利に管理します。必要なのは、 を介してプロデューサー タスクとキュー タスクを実装することだけですQueueUserWorkItem
。
Task
あるいは、TPL コンストラクトを使用する場合は、 とおそらく の組み合わせを使用して、上記のメカニズムを自分で実装できますConcurrentQueue
。