Programmering

Hvordan jobbe med Parallel LINQ i C #

Language Integrated Query, også kjent som LINQ, er en pipeline for spørringsutførelse som legger til søkefunksjoner til språk som er målrettet mot det administrerte miljøet til .Net. Parallel LINQ, eller PLINQ, er en spørringsutførelsesmotor som kjører på toppen av det administrerte miljøet til .Net og utnytter flere prosessorer eller kjerner i datasystemet ditt for å utføre spørringene parallelt. Med andre ord, det gjør det mulig å optimalisere spørsmålene dine ved å dele dem opp i deler for å utføre disse delene parallelt og dermed øke spørringsytelsen.

PLINQ er en utvidelse til LINQ og ble introdusert som en del av .Net Framework 4. Det er en spørringsutførelsesmotor fra Microsoft og er en del av Parallel Extensions Library. Parallel Extensions Library består i sin tur av TPL (Task Parallel Library) og PLINQ. Microsoft har gitt støtte for parallell programmering i .Net Framework for å utnytte fordelene med flerkjernesystemer. For å dra nytte av de parallelle programmeringsfunksjonene ble en ny klasse kalt Parallel introdusert i .Net Framework 4.

PLINQ er et godt valg i databaserte operasjoner. Men hva handler det om og hva er problemene det kan løse? Er det hensiktsmessig å bruke den i stedet for LINQ når vi trenger å spørre om data? Vi vil diskutere alle disse på et øyeblikk, men la oss først forstå hvordan PLINQ fungerer bak kulissene. PLINQ fungerer ved å partisjonere datakilden eller inngangen i biter som igjen utføres av forskjellige tråder.

Litt kode nå

Vurder følgende LINQ-spørring.

var data = fra e hos ansatte

der e.FirstName.StartsWith ("J")

velg e;

Du kan enkelt konvertere spørringen ovenfor til et PLINQ-spørsmål ved å bruke AsParallel-utvidelsesmetoden. Merk at AsParallel er en utvidelsesmetode for klassen System.Linq.ParallelEnumerable.

var data = fra e i ansatte.AsParallel ()

der e.FirstName.StartsWith ("J")

velg e;

Hvis du vil bevare rekkefølgen på søkeresultatet, kan du dra nytte av AsOrdered-metoden.

var data = fra e i ansatte.AsParallel (). som bestilt ()

der e.FirstName.StartsWith ("J")

velg e;

Du kan også bevare rekkefølgen på dataene som returneres som et resultat av kjøring av PLINQ-spørringen ved å sende QueryOptions.PreserveOrdering som en parameter til AsParallel-metoden.

var data = fra e i ansatte.AsParallel (QueryOptions.PreserveOrdering)

der e.FirstName.StartsWith ("J")

velg e;

Merk at bruk av AsParallel () -metoden ikke er tilrådelig i små samlinger - den vil heller kjøre langsommere sammenlignet med en vanlig spørring. Hva om du vil tvinge parallellitet? Dette anbefales ikke, men du kan bruke WithExecutionMode-utvidelsesmetoden for å oppnå dette. Her er et eksempel som illustrerer dette.

var data = fra e i ansatte.AsParallel (). WithExecutionMode

(ParallelExecutionMode.ForceParallelism)

der e.FirstName.StartsWith ("J")

velg e;

Merk at ParallelExecutionMode er en oppregning som er tilgjengelig som en del av System.Linq-navneområdet og kan ha en av disse verdiene: Standard og ForceParallelism. Hvis du angir standard som parameter for utvidelsesmetoden WithExecutionMode, vil PLINQ utføre spørringen parallelt hvis det er tydelig at ytelsen forbedres ved å utføre spørringen parallelt. Hvis ikke, vil PLINQ utføre spørringen akkurat som et LINQ-spørsmål. Tvert imot, hvis du spesifiserer ForeParallelism som en parameter til WithExecutionMode-utvidelsesmetoden, vil PLINQ utføre spørringen parallelt, selv om det høye pådrar seg en ytelsesstraff.

Hvordan begrenser jeg graden av parallellitet?

Du bør også være klar over et annet relatert konsept: grad av parallellitet. Dette er et usignert heltall som angir det maksimale antall prosessorer som PLINQ-spørringen din bør dra nytte av mens den er i utførelse. Med andre ord er grad av parallellitet et helt tall som angir det maksimale antall oppgaver som vil bli utført samtidig for å behandle et spørsmål.

For øvrig er standardverdien for graden av parallellitet 64, noe som innebærer at PLINQ kan utnytte maksimalt 64 prosessorer i systemet ditt. Slik kan du begrense graden av parallellitet i PLINQ til to prosessorer i systemet ditt.

var data = fra e i ansatte.AsParallel (). WithDegreeOfParallelism (2)

der e.FirstName.StartsWith ("J")

velg e;

Legg merke til hvordan antall prosessorer har blitt sendt som et argument til WithDegreeofParallelism-metoden. Du bør spesifisere en høyere verdi for graden av parallellitet for ytelsesgevinster hvis spørringen din utfører mer ikke-beregnet innbundet, dvs. ikke-CPU-bundet arbeid.

Jeg anbefaler på det sterkeste å lese dokumentet "Patterns of Parallel Programming" av Stephen Toub. Det gir en grundig diskusjon om parallelle programmeringsmønstre i .Net.

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