0

データベースから数行 (数百万になる可能性があります) を c# で並行して処理する必要があります。処理は非常に高速 (50 または 150 ミリ秒/ライン) ですが、ハードウェア/ネットワークに依存するため、実行前にこの速度を知ることはできません。

ThreadPool または新しい TaskParallelLibrary は、スレッド化が初めてで、データを処理する最も効率的な方法を取得したいので、私のニーズを満たすもののようです。

ただし、これらの方法では、タスクの実行速度 (行/分) を制御する方法は提供されません。処理の最大速度制限を設定したり、フル スピードで実行したりしたいと考えています。

ThreadPool/TaskFactory のスレッド数を設定しても、私のニーズに対して十分な精度が得られないことに注意してください。速度制限を「1 つのスレッド速度」未満に設定できるようにしたいからです。

TPL のカスタム シェデュラーを使用することは、それを行う方法のようですが、それを実装する方法が見つかりませんでした。

さらに、そのようなセットアップにかかる効率コストが心配です。

この仕事を達成する方法やアドバイスを教えていただけますか?

ご回答ありがとうございます。

4

2 に答える 2

1

TPL は、スレッド プールの上に便利なプログラミングの抽象化を提供します。それがオプションである場合、私は常にTPLを選択します。

合計処理速度を調整したい場合、それをサポートする組み込み機能はありません。

ファイルを処理しながら全体の処理速度を測定し、各スレッドに (非回転) 遅延を導入することで速度を調整できます。遅延のサイズは、観察された処理速度に基づいてコードで動的に調整できます。

于 2012-12-11T21:10:25.173 に答える
0

速度を制限することの利点はわかりませんが、操作の最大並列度を制限することを検討することをお勧めします。これは、ParalleForEach オプション プロパティの MaxDegreeOfParallelism を介して行うことができます。これは、コードがデータの異なるに対して機能するためです。そうすれば、作業している基準に応じて拡張または減算できる、より適切な用語がない場合にスロットを制御できます。

以下は、ConcurrentBagを使用して分散データの行を処理し、2 つの並列タスクを使用する例です。

   var myLines = new List<string> { "Alpha", "Beta", "Gamma", "Omega" };

   var stringResult = new ConcurrentBag<string>();

   ParallelOptions parallelOptions = new ParallelOptions();

   parallelOptions.MaxDegreeOfParallelism = 2;

   Parallel.ForEach( myLines, parallelOptions, line =>
   {
      if (line.Contains( "e" ))
         stringResult.Add( line );

   } );

   Console.WriteLine( string.Join( " | ", stringResult ) );
   // Outputs Beta | Omega

並列オプションには、より多くの処理を調整できるTaskSchedulerプロパティもあります。最後に、より細かく制御するために、特定のしきい値に達したときに処理をキャンセルしたいですか? その場合は、 CancellationTokenプロパティを調べて、プロセスを早期に終了してください。

于 2012-12-11T21:42:21.303 に答える