web-dev-qa-db-ja.com

AsParallel()の最大並列度

Parallel.ForEachを使用している間に、Parallelオプションを定義し、Max Degree of Parallelismを次のように設定するオプションがあります。

Parallel.ForEach(values, new ParallelOptions {MaxDegreeOfParallelism = number}, value = > {
    // Do Work
})

しかし、PLINQの実行中は次のようになります。

Tabel.AsEnumberable()
     .AsParallel()
     .Where(//Logic)

MaxDegreeOfParallelismを設定する方法が見つかりませんでした。私もネットで調べましたが、何も見つかりませんでした。誰かがこれを回避する方法を見つけましたか?どんな助けも大歓迎です。

24
codingpirate

ParallelEnumerable.WithDegreeOfParallelism

クエリで使用する並列度を設定します。並列度は、クエリの処理に使用される同時実行タスクの最大数です。

var result = Tabel.AsEnumberable()
                  .AsParallel()
                  .WithDegreeOfParallelism(number)
                  .Where(/* predicate */);

編集:

@svickは ParallelOptions.MaxDegreeOfParallelism vs PLINQのWithDegreeOfParallelism で優れた機能を提供し、2つの違いを強調しています。

Parallelは、レプリケートタスクと呼ばれる隠れた概念を使用して動作します。概念は、ループを処理するための1つのタスクでループが開始することですが、処理を支援するためにさらにスレッドが使用可能になると、それらのスレッドで実行する追加のタスクが作成されます。これにより、リソース消費を最小限に抑えることができます。 これを考えると、ParallelOptionsがDegreeOfParallelismの指定を有効にすると述べるのは不正確です。なぜなら、それは実際には最大次数であるためです: 1、およびリソースが使用可能になったときに指定された最大値まで機能します。

PLINQは異なります。 PLINQのいくつかの重要な標準クエリ演算子は、クエリの処理に関与するスレッド間の通信を必要とします。これには、スレッドをロックステップで動作させるためにバリアに依存するものも含まれます。 PLINQ設計では、クエリが進行するために特定の数のスレッドがアクティブに関与する必要があります。したがって、PLINQにDegreeOfParallelismを指定する場合、最大数ではなく、実際に関与するスレッドの数を指定しています。

43
Yuval Itzchakov

はい、あなたは確かにそれを行うことができます。 WithDegreeOfParallelism 拡張メソッドを使用するだけです

yourSequence.AsParallel()
    .WithDegreeOfParallelism(5)//Whatever number as you like
    .Where(...);
8
<IEnumerable>.AsParallel()
.WithDegreeOfParallelism(n)
.Where(x=>)
0
letscode