2012-04-04 15 views
0

私は1600万のデータベースレコードを処理する必要があり、これは私を永遠に連れて行くでしょう。私は精通しているので、ここで尋ねると思った。私の考えは、私は次のことを実行する必要がありますが、方法がわからないだということです: スレッディング/ TPLなど

  • は上の処理のためにこれらのチャンクのそれぞれを送信する「チャンク」
  • の数にこれらを分割

    1. は私の16メートルのレコードを取得し、そのスレッド上で

    これは正しいと思いますが、ワークロード(16mレコード)を分割するとどうなりますか?

    健全なアドバイスを提供できる場合はよろしく。

  • +1

    1つの質問:これはTPLだけでなくC#3.0でもタグ付けされていますが、TPLには.net4.0が付属していますので、C#4.0を使用できるはずです。 msdn.microsoft.com/de-at/devlabs/gg585582興味深い – Carsten

    +0

    @CarstenKönig、TPLデータフローはより複雑なフローです。この場合、それが役に立つとは思わない。 – svick

    +0

    ... IMHOこれは合理的なシナリオです – Carsten

    答えて

    1

    私はあなたが以下のようによく知られている生産者 - 消費者パターンを使用することをお勧め:

    • 単一のスレッド(プロデューサー)DBからレコードを取り出し、単一または多分複数のレコードを持つタスクを(作成し、処理する)、それらを共有キューに入れます。
    • スレッドのグループ(コンシューマ)は、タスクをキューから取り出し、並列に処理します。

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

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

    +1

    これはちょっと混乱します。 TPLのコンストラクト*は、Produces-Consumerパターンの実装です。 - ConcurrentQueueは、IProducerConsumerインターフェイスも実装します。 ThredPoolを使用するには、同じメカニズムをもう一度実装する必要があります。 –

    1

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

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