-1

さて、動的に多くのスレッドを実際に利用しなければならなくなってから、しばらく経ちました。

基本的に状況は次のとおりです。

私はデータベースクエリから大きなコレクションを持っています.100万行が返され、何らかのコレクション(arraylist、mapなど)に格納されています。そのコレクションを取得して、スレッドやプロセスなどに分割して、作業を効率的に完了できるようにしたいと考えていました。ただし、コレクション全体をさまざまなプロセスに均等に分割したくありません。それぞれ30行で動作する10個のスレッドが必要であり、それらが処理を完了すると、元のコレクションからより多くの行を取得します。

これは、この問題を解決するために頭に浮かんだ最初のことです。スレッドへのコレクションの動的割り当てがどのようになるかはわかりません。最終的には、個々のプロセスの結果をすべて収集し、将来の処理のために別のコレクションにコンパイルしたいと考えています。クエリ結果が非常に多数の行になることはわかっており、最初にスレッドに部分を動的に割り当て、タスクを終了することがこれを処理する最善の方法であると考えました。

これは 2 つの部分からなる質問です。1 つ目は、…たとえば…これの疑似コードはどのようになるでしょうか? 2つ目は、これがこの状況を処理する最善の方法ですか?

どんな助けでも大歓迎です。ああ、私はこれのために C# で作業することを考えています。

ありがとう!

4

2 に答える 2

1

PLINQ (Parallel Linq) が当然の選択だと思います。MSDN の簡単な例:

var source = Enumerable.Range(1, 10000);


// Opt-in to PLINQ with AsParallel 
var evenNums = from num in source.AsParallel()
               where Compute(num) > 0
               select num;

これは、多くの場合、コレクション内のすべてのアイテムと処理が独立していることを前提としています。もう 1 つのオプションは、より高度な操作のための TPL (タスク並列ライブラリ) です。これは、TPLの優れたレイトレーサーの例です。

于 2013-04-30T20:37:12.243 に答える
0

リストのセクションの配布を担当するメソッドを作成し、個々のワーカー スレッドが現在のセクションを処理し終わったときにセクションを要求するようにすることができます。manager メソッドはスレッドセーフである必要がありますが、それ以外はほとんどそれ自体でビルドされます。

于 2013-04-30T20:36:14.583 に答える