Προγραμματισμός

Πώς να εργαστείτε με το Parallel LINQ στο C #

Το Language Integrated Query, επίσης γνωστό ως LINQ, είναι ένας αγωγός εκτέλεσης ερωτημάτων που προσθέτει δυνατότητες ερωτήματος σε γλώσσες που στοχεύουν στο διαχειριζόμενο περιβάλλον του .Net. Το Parallel LINQ, ή PLINQ, είναι μια μηχανή εκτέλεσης ερωτημάτων που τρέχει πάνω από το διαχειριζόμενο περιβάλλον του .Net και εκμεταλλεύεται τους πολλαπλούς επεξεργαστές ή πυρήνες στο σύστημα του υπολογιστή σας για την εκτέλεση των ερωτημάτων παράλληλα. Με άλλα λόγια, σας επιτρέπει να βελτιστοποιήσετε τα ερωτήματά σας χωρίζοντάς τα σε τμήματα, ώστε να εκτελέσετε αυτά τα μέρη παράλληλα και, επομένως, να ενισχύσετε την απόδοση του ερωτήματος.

Το PLINQ είναι μια επέκταση στο LINQ και παρουσιάστηκε ως μέρος του .Net Framework 4. Πρόκειται για μηχανή εκτέλεσης ερωτημάτων από τη Microsoft και αποτελεί μέρος της βιβλιοθήκης Parallel Extensions. Η βιβλιοθήκη Parallel Extensions αποτελείται από τη σειρά TPL (Task Parallel Library) και PLINQ. Η Microsoft παρείχε υποστήριξη για παράλληλο προγραμματισμό στο .Net Framework για να αξιοποιήσει τα οφέλη των συστημάτων πολλαπλών πυρήνων. Για να εκμεταλλευτείτε τις δυνατότητες παράλληλου προγραμματισμού, μια νέα κλάση που ονομάζεται Parallel εισήχθη στο .Net Framework 4.

Το PLINQ είναι μια καλή επιλογή στις λειτουργίες που συνδέονται με υπολογιστές. Αλλά, τι είναι όλα και ποια είναι τα προβλήματα που μπορεί να λύσει; Είναι κατάλληλο να το χρησιμοποιήσετε αντί του LINQ όποτε χρειαζόμαστε ερωτήματα δεδομένων; Θα τα συζητήσουμε όλα αυτά σε μια στιγμή αλλά ας καταλάβουμε πρώτα πώς λειτουργεί το PLINQ πίσω από τα παρασκήνια. Το PLINQ λειτουργεί χωρίζοντας την πηγή δεδομένων ή την είσοδο σε κομμάτια τα οποία με τη σειρά τους εκτελούνται από διαφορετικά νήματα.

Λίγο κώδικα τώρα

Εξετάστε το ακόλουθο ερώτημα LINQ.

var data = από e σε υπαλλήλους

όπου e.FirstName.StartsWith ("J")

επιλέξτε e;

Μπορείτε να μετατρέψετε το παραπάνω ερώτημα εύκολα σε ερώτημα PLINQ χρησιμοποιώντας τη μέθοδο επέκτασης AsParallel. Σημειώστε ότι το AsParallel είναι μια μέθοδος επέκτασης της κλάσης System.Linq.ParallelEnumerable.

var data = από e σε υπαλλήλους. AsParallel ()

όπου e.FirstName.StartsWith ("J")

επιλέξτε e;

Εάν θέλετε να διατηρήσετε τη σειρά του αποτελέσματος του ερωτήματος, μπορείτε να επωφεληθείτε από τη μέθοδο AsOrdered.

var data = από e σε υπαλλήλους. AsParallel (). AsOrdered ()

όπου e.FirstName.StartsWith ("J")

επιλέξτε e;

Μπορείτε επίσης να διατηρήσετε τη σειρά των δεδομένων που επιστρέφονται ως αποτέλεσμα της εκτέλεσης του ερωτήματος PLINQ περνώντας το QueryOptions.PreserveOrdering ως παράμετρος στη μέθοδο AsParallel.

var data = από e σε υπαλλήλους. AsParallel (QueryOptions.PreserveOrdering)

όπου e.FirstName.StartsWith ("J")

επιλέξτε e;

Σημειώστε ότι η χρήση της μεθόδου AsParallel () δεν συνιστάται σε μικρές συλλογές - θα προτιμούσε να λειτουργεί πιο αργά σε σύγκριση με ένα κανονικό ερώτημα. Τι γίνεται αν θέλετε να επιβάλλετε τον παραλληλισμό; Αυτό δεν συνιστάται, αλλά μπορείτε να αξιοποιήσετε τη μέθοδο επέκτασης WithExecutionMode για να το επιτύχετε. Εδώ είναι ένα παράδειγμα που το εξηγεί αυτό.

var data = από e σε υπαλλήλους. AsParallel (). WithExecutionMode

(ParallelExecutionMode.ForceParallelism)

όπου e.FirstName.StartsWith ("J")

επιλέξτε e;

Σημειώστε ότι το ParallelExecutionMode είναι μια απαρίθμηση που είναι διαθέσιμη ως μέρος του χώρου ονομάτων System.Linq και μπορεί να έχει μία από αυτές τις τιμές: Προεπιλογή και ForceParallelism. Εάν ορίσετε την προεπιλογή ως παράμετρο για τη μέθοδο επέκτασης WithExecutionMode, το PLINQ θα εκτελέσει το ερώτημα παράλληλα εάν είναι εμφανής βελτίωση στην απόδοση κατά την εκτέλεση του ερωτήματος παράλληλα. Εάν όχι, το PLINQ θα εκτελούσε το ερώτημα όπως ένα ερώτημα LINQ. Αντίθετα, εάν ορίσετε το ForeParallelism ως παράμετρο για τη μέθοδο επέκτασης WithExecutionMode, το PLINQ θα εκτελούσε το ερώτημα παράλληλα, ακόμη και αν αυτό θα επιβληθεί ποινή απόδοσης.

Πώς μπορώ να περιορίσω τον βαθμό παραλληλισμού;

Θα πρέπει επίσης να γνωρίζετε μια άλλη σχετική έννοια: βαθμός παραλληλισμού. Αυτός είναι ένας μη υπογεγραμμένος ακέραιος αριθμός που δηλώνει τον μέγιστο αριθμό επεξεργαστών που πρέπει να εκμεταλλευτεί το ερώτημά σας PLINQ ενώ βρίσκεται σε εκτέλεση. Με άλλα λόγια, ο βαθμός παραλληλισμού είναι ένας ακέραιος που δηλώνει τον μέγιστο αριθμό εργασιών που θα εκτελούνται ταυτόχρονα για την επεξεργασία ενός ερωτήματος.

Παρεμπιπτόντως, η προεπιλεγμένη τιμή του βαθμού παραλληλισμού είναι 64 που σημαίνει ότι το PLINQ μπορεί να αξιοποιήσει έως 64 επεξεργαστές στο σύστημά σας. Δείτε πώς μπορείτε να περιορίσετε τον βαθμό παραλληλισμού στο PLINQ σε δύο επεξεργαστές στο σύστημά σας.

var data = από e σε υπαλλήλους. AsParallel (). WithDegreeOfParallelism (2)

όπου e.FirstName.StartsWith ("J")

επιλέξτε e;

Σημειώστε πώς ο αριθμός των επεξεργαστών μεταβιβάστηκε ως επιχείρημα στη μέθοδο WithDegreeofParallelism. Θα πρέπει να καθορίσετε μια υψηλότερη τιμή για τον βαθμό παραλληλισμού για κέρδη απόδοσης, εάν το ερώτημά σας εκτελεί περισσότερη σύνδεση χωρίς υπολογισμούς, δηλαδή εργασία χωρίς δέσμευση CPU.

Συνιστώ ανεπιφύλακτα να διαβάσετε το έγγραφο "Μοτίβα παράλληλου προγραμματισμού" του Stephen Toub. Παρέχει μια εις βάθος συζήτηση για τα παράλληλα σχέδια προγραμματισμού στο .Net.

$config[zx-auto] not found$config[zx-overlay] not found