私は1600万のデータベースレコードを処理する必要があり、これは私を永遠に連れて行くでしょう。私は精通しているので、ここで尋ねると思った。私の考えは、私は次のことを実行する必要がありますが、方法がわからないだということです: スレッディング/ TPLなど
- は私の16メートルのレコードを取得し、そのスレッド上で
これは正しいと思いますが、ワークロード(16mレコード)を分割するとどうなりますか?
健全なアドバイスを提供できる場合はよろしく。
私は1600万のデータベースレコードを処理する必要があり、これは私を永遠に連れて行くでしょう。私は精通しているので、ここで尋ねると思った。私の考えは、私は次のことを実行する必要がありますが、方法がわからないだということです: スレッディング/ TPLなど
これは正しいと思いますが、ワークロード(16mレコード)を分割するとどうなりますか?
健全なアドバイスを提供できる場合はよろしく。
私はあなたが以下のようによく知られている生産者 - 消費者パターンを使用することをお勧め:
これを実装する非常に簡単な方法は、ThreadPool
クラスを使用することです。キューとワーカーを便利に管理します。 QueueUserWorkItem
でプロデューサタスクとキュータスクを実装するだけです。
また、TPLコンストラクトを使用する場合は、Task
とおそらくはConcurrentQueue
の組み合わせを使用して、上記のメカニズムを実装することができます。
これはちょっと混乱します。 TPLのコンストラクト*は、Produces-Consumerパターンの実装です。 - ConcurrentQueueは、IProducerConsumerインターフェイスも実装します。 ThredPoolを使用するには、同じメカニズムをもう一度実装する必要があります。 –
アイテムのコレクションを並行して処理する場合は、それはまさにParallel.Foreach()
の対象です。各アイテム(おそらくラムダ)に対して実行したいアクションを渡すだけで、コレクションをチャンクに分割して実行することができます。
しかし、あなたはその行動に何を入れるかについて注意する必要があります。これはコードが同時に複数のスレッドで実行されるためです。スレッドセーフではない方法で共有状態にアクセスしないでください。
1つの質問:これはTPLだけでなくC#3.0でもタグ付けされていますが、TPLには.net4.0が付属していますので、C#4.0を使用できるはずです。 msdn.microsoft.com/de-at/devlabs/gg585582興味深い – Carsten
@CarstenKönig、TPLデータフローはより複雑なフローです。この場合、それが役に立つとは思わない。 – svick
... IMHOこれは合理的なシナリオです – Carsten