So arbeiten Sie mit Parallel LINQ in C #

Language Integrated Query, auch als LINQ bezeichnet, ist eine Pipeline zur Ausführung von Abfragen, die Sprachen, die auf die verwaltete Umgebung von .Net abzielen, Abfragefunktionen hinzufügt. Parallel LINQ oder PLINQ ist eine Abfrageausführungs-Engine, die auf der verwalteten Umgebung von .Net ausgeführt wird und die mehreren Prozessoren oder Kerne in Ihrem Computersystem nutzt, um die Abfragen parallel auszuführen. Mit anderen Worten, Sie können Ihre Abfragen optimieren, indem Sie sie in Teile aufteilen, um diese Teile parallel auszuführen und damit die Abfrageleistung zu steigern.

PLINQ ist eine Erweiterung von LINQ und wurde als Teil von .Net Framework 4 eingeführt. Es ist eine Abfrageausführungs-Engine von Microsoft und Teil der Parallel Extensions Library. Die Parallel Extensions Library besteht wiederum aus der TPL (Task Parallel Library) und PLINQ. Microsoft hat die parallele Programmierung in .Net Framework unterstützt, um die Vorteile von Multi-Core-Systemen zu nutzen. Um die Funktionen der parallelen Programmierung nutzen zu können, wurde in .Net Framework 4 eine neue Klasse namens Parallel eingeführt.

PLINQ ist eine gute Wahl für rechnergebundene Operationen. Aber worum geht es und welche Probleme kann es lösen? Ist es angemessen, es anstelle von LINQ zu verwenden, wenn Daten abgefragt werden müssen? Wir würden all dies gleich diskutieren, aber lassen Sie uns zunächst verstehen, wie PLINQ hinter den Kulissen funktioniert. PLINQ partitioniert die Datenquelle oder die Eingabe in Blöcke, die wiederum von verschiedenen Threads ausgeführt werden.

Ein bisschen Code jetzt

Betrachten Sie die folgende LINQ-Abfrage.

var data = from e in employees

           where e.FirstName.StartsWith("J")

           select e;

Sie können die obige Abfrage mithilfe der AsParallel-Erweiterungsmethode einfach in eine PLINQ-Abfrage konvertieren. Beachten Sie, dass AsParallel eine Erweiterungsmethode der System.Linq.ParallelEnumerable-Klasse ist.

var data = from e in employees.AsParallel()

           where e.FirstName.StartsWith("J")

           select e;

Wenn Sie die Reihenfolge des Abfrageergebnisses beibehalten möchten, können Sie die AsOrdered-Methode verwenden.

var data = from e in employees.AsParallel().AsOrdered()

           where e.FirstName.StartsWith("J")

           select e;

Sie können auch die Reihenfolge der Daten beibehalten, die als Ergebnis der Ausführung der PLINQ-Abfrage zurückgegeben werden, indem Sie QueryOptions.PreserveOrdering als Parameter an die AsParallel-Methode übergeben.

var data = from e in employees.AsParallel(QueryOptions.PreserveOrdering)

           where e.FirstName.StartsWith("J")

           select e;

Beachten Sie, dass die Verwendung der AsParallel () -Methode für kleine Sammlungen nicht ratsam ist. Sie wird im Vergleich zu einer normalen Abfrage eher langsamer ausgeführt. Was ist, wenn Sie Parallelität erzwingen möchten? Dies wird zwar nicht empfohlen, Sie können jedoch die WithExecutionMode-Erweiterungsmethode nutzen, um dies zu erreichen. Hier ist ein Beispiel, das dies veranschaulicht.

var data = from e in employees.AsParallel().WithExecutionMode

                (ParallelExecutionMode.ForceParallelism)

           where e.FirstName.StartsWith("J")

           select e;

Beachten Sie, dass ParallelExecutionMode eine Aufzählung ist, die als Teil des System.Linq-Namespace verfügbar ist und einen der folgenden Werte haben kann: Default und ForceParallelism. Wenn Sie Standard als Parameter für die WithExecutionMode-Erweiterungsmethode angeben, führt PLINQ die Abfrage parallel aus, wenn bei der parallelen Ausführung der Abfrage eine Leistungsverbesserung erkennbar ist. Wenn nicht, würde PLINQ die Abfrage genau wie eine LINQ-Abfrage ausführen. Im Gegenteil, wenn Sie ForeParallelism als Parameter für die WithExecutionMode-Erweiterungsmethode angeben, würde PLINQ die Abfrage parallel ausführen, selbst wenn dies zu einer Leistungsbeeinträchtigung führen könnte.

Wie beschränke ich den Grad der Parallelität?

Sie sollten sich auch eines anderen verwandten Konzepts bewusst sein: Grad der Parallelität. Dies ist eine vorzeichenlose Ganzzahl, die die maximale Anzahl von Prozessoren angibt, die Ihre PLINQ-Abfrage während der Ausführung nutzen sollte. Mit anderen Worten, der Parallelitätsgrad ist eine Ganzzahl, die die maximale Anzahl von Aufgaben angibt, die gleichzeitig ausgeführt werden würden, um eine Abfrage zu verarbeiten.

Im Übrigen beträgt der Standardwert für den Parallelitätsgrad 64, was bedeutet, dass PLINQ maximal 64 Prozessoren in Ihrem System nutzen kann. So können Sie den Parallelitätsgrad in PLINQ auf zwei Prozessoren in Ihrem System beschränken.

var data = from e in employees.AsParallel().WithDegreeOfParallelism(2)

           where e.FirstName.StartsWith("J")

           select e;

Beachten Sie, wie die Anzahl der Prozessoren als Argument an die WithDegreeofParallelism-Methode übergeben wurde. Sie sollten einen höheren Wert für den Grad der Parallelität für Leistungssteigerungen angeben, wenn Ihre Abfrage mehr nicht rechnergebundene, dh nicht CPU-gebundene Arbeiten ausführt.

Ich empfehle dringend, das Dokument "Patterns of Parallel Programming" von Stephen Toub zu lesen. Es bietet eine eingehende Diskussion der parallelen Programmiermuster in .Net.