Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

LINQ Grundkurs

Parallelität mit PLINQ

Testen Sie unsere 2021 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Mit PLINQ können Abfragen parallelisiert werden. Dies kann gerade bei Aggregationen die Leistung immens steigern.
06:44

Transkript

Definieren wir LINQ-Abfrage, werden die in aller Regel in dem Thread ausgeführt, in dem wir sie gestartet haben. Das können wir ändern, wir können Berechnungen tatsächlich auf mehrere Threads aufspalten. Dies geschieht mit PLINQ beziehungsweise Parallel LINQ. Man kann sich das Ganze so vorstellen, dass man eine LINQ-Abfrage parallelisiert, indem man zuerst den AsParallel-Aufruf startet und danach den Befehl ausführt, den man eigentlich ausführen möchte, zum Beispiel eine Summierung. Meine Liste wurde demnach auf mehrere Threads aufgeteilt. Dann wurden die Ergebnisse für diese Teillisten ausgerechnet, bevor sie zurückgegeben wurden. Also kann man sich das eventuell so vorstellen, dass die Zahlen von 1 bis 4 in einem Thread zusammengerechnet wurden und 5 bis 9 in einem anderen Thread, und dabei die Teilergebnisse am Ende zusammengeführt wurden. Auf diese Weise erhöhen wir natürlich die Geschwindigkeit bei solchen Abfragen, da wir die Prozessorarchitektur von modernen Prozessoren sehr gut ausnutzen. Denn wir können damit alle Kerne zeitgleich belasten, statt immer nur einen Kern mit unseren Berechnungen zu belasten. Möchte man Optionen verwenden bei der Parallelisierung, muss man diese nach AsParallel angeben. Wichtig sind dabei der ExecutionMode, den man mit WithExecutionMode angeben kann. Hierbei wird gesagt, ob eine Parallelisierung ... Hierbei wird gesagt, ob LINQ entscheiden darf, dass es parallelisiert oder nicht, oder ob wir eine Parallelisierung erzwingen. Denn PLINQ sagt zwar aus, dass es parallel wäre, berechnet im Vorfeld einer Parallelisierung aber immer, ob es wirklich sinnvoll ist, eine solche vorzunehmen. Mit ForceParallelism wird diese Parallelisierung erzwungen. Die vorangegangene Berechnung, ob es sinnvoll ist, wird nicht ausgeführt. Dabei kann es aber zu einem gewissen Overhead kommen. Denn wenn wir auf kleine Ergebnismengen eine Parallelisierung ausführen, kann die Akquirierung von Systemressourcen zur Parallelisierung aufwendiger sein als die Daten einfach sequenziell zu ermitteln, und nicht asynchron. Neben ExecutionMode können wir mit WithCancellation einen sogenannten CancellationToken hinterlegen. Diese CancellationToken haben die Eigenschaft, dass man mit Ihnen jegliche Thread-Abarbeitung abbrechen kann. Sie können sich das in der UI so vorstellen, dass jemand auf einen Button klickt und die Berechnung wird abgebrochen, statt dass er immer darauf warten muss, dass sie komplett durchläuft. Mit WithDegreeOfParallelism können wir angeben, wie sehr parallelisiert werden soll. Dabei ist zu beachten, dass der minimierende Faktor vor allem die Kernanzahl unserer CPU ist. Wenn ich hier zum Beispiel 2 angebe, wird bei einer Parallelisierung immer erzwungen, dass ich mit zwei Threads arbeite. meine Liste wird also halbiert. Würde ich hier eine 4 angeben und hätte vier Kerne, dann würde sie gegebenenfalls geviertelt. Auch hier ist der Punkt gegeben, dass eine höhere Parallelisierung bei geringeren Eingabemengen durchaus einen Overhead generieren kann, der den gesamten Vorteil zunichte macht. Wurden die Teilergebnisse ermittelt, werden diese zusammengeführt. Sie werden also gemerged. Wie sie gemerged werden, gibt man an über WithMergeOptions. Standardmäßig ist dies AutoBuffered. AutoBuffered heißt, dass einzelne Teilergebnisse zusammengeführt werden und dann wie in einem Paket zurückgegeben werden. Es gibt sozusagen mehrere Einzelergebnisse, die zurückgeliefert werden. Demgegenüber ist FullyBuffered so eingestellt, dass zuerst alle Teilergebnisse zusammengerechnet werden, und erst wenn es ein Gesamtergebnis gibt, wird dieses zurückgeliefert. Bei NotBuffered werden alle Teilergebnisse sofort zurückgeliefert und wir haben eine Art Datenstrom. Kommen wir noch zu einigen etwas verwirrenden Eigenschaften, und zwar AsOrdered und AsUnordered sowie AsSequential. Mit AsOrdered können wir sagen, dass die Eingabeliste in genau der Reihenfolge verarbeitet werden soll, wie sie hineingegeben wird. Also erst die 1, dann die 2, die 3, die 4, die 5, die 6, die 7 und die 8. Der Grund, warum es diesen Befehl gibt, ist, dass es bei mathematischen Berechnungen natürlich durchaus sinnvoll sein kann, dass die Reihenfolge eingehalten wird. Einige Befehle sorgen auch dafür, dass Dinge ungeordnet werden, wie zum Beispiel Reverse. Mit AsOrdered kann ich also angeben, dass die Liste in ihrer Reihenfolge beachtet werden soll. Während AsUnordered aussagt, dass die Reihenfolge nicht beachtet werden muss. Das Ganze ist etwas verwirrend und durchaus auch abhängig davon, welche Befehle im Vorfeld ausgeführt wurden. Aus diesem Grund empfehle ich Ihnen an dieser Stelle tatsächlich die MSDN-Dokumentation zu lesen. Denn diese ist äußerst umfangreich. Und allein die Erklärung der Punkte darin würden dieses Tutorial sprengen. Der letzte Punkt, den wir haben, ist AsSequential. Mit AsSequential kann ich aus einer parallelen Abfrage eine sequenzielle Abfrage machen. Das ist immer dann sinnvoll, wenn Sie mehrere parallele Abfragen haben und auf deren Gesamtergebnis warten wollen, um sie dann sequenziell weiterzuverarbeiten. Durch dieses AsSequential machen Sie also aus einer PLINQ-Abfrage eine ganz normale LINQ-Abfrage.

LINQ Grundkurs

Lernen Sie die LINQ-Operationen kennen und erstellen Sie praktische Abfragen direkt in C# und .NET.

2 Std. 10 min (26 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Hersteller:
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:24.10.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!