Programiranje

Kako delati s Parallel LINQ v C #

Jezikovno integrirana poizvedba, znana tudi kot LINQ, je cevovod za izvajanje poizvedb, ki jezikom, usmerjenim v upravljano okolje .Net, doda zmožnosti poizvedb. Vzporedni LINQ ali PLINQ je mehanizem za izvajanje poizvedb, ki deluje nad upravljanim okoljem .Net in izkorišča prednosti več procesorjev ali jeder v računalniškem sistemu za vzporedno izvajanje poizvedb. Z drugimi besedami, omogoča optimizacijo poizvedb, tako da jih razdeli na dele, tako da jih lahko izvajate vzporedno in s tem povečate uspešnost poizvedbe.

PLINQ je razširitev LINQ-a in je bil uveden kot del .Net Framework 4. Je Microsoftov mehanizem za izvajanje poizvedb in je del knjižnice vzporednih razširitev. Knjižnico vzporednih razširitev sestavljata TPL (Task Parallel Library) in PLINQ. Microsoft je zagotovil podporo za vzporedno programiranje v .Net Framework, da bi izkoristil prednosti večjedrnih sistemov. Da bi izkoristili zmožnosti vzporednega programiranja, je bil v .Net Framework 4 uveden nov razred, imenovan Parallel.

PLINQ je dobra izbira pri računsko vezanih operacijah. Za kaj pa gre in kakšne težave lahko reši? Ali ga je primerno uporabiti namesto LINQ, kadar koli potrebujemo podatke? O vsem tem bi razpravljali v trenutku, a najprej ugotovimo, kako PLINQ deluje v zakulisju. PLINQ deluje tako, da vir podatkov ali vhod razdeli na koščke, ki se nato izvajajo z različnimi nitmi.

Zdaj malo kode

Upoštevajte naslednjo poizvedbo LINQ.

var podatki = od e pri zaposlenih

kjer e.FirstName.StartsWith ("J")

izberite e;

Zgornjo poizvedbo lahko enostavno pretvorite v poizvedbo PLINQ z uporabo metode razširitve AsParallel. Upoštevajte, da je AsParallel metoda razširitve razreda System.Linq.ParallelEnumerable.

var podatki = od e pri zaposlenih.AsParallel ()

kjer e.FirstName.StartsWith ("J")

izberite e;

Če želite ohraniti vrstni red rezultata poizvedbe, lahko izkoristite metodo AsOrdered.

var podatki = od e pri zaposlenih.AsParallel (). AsOrdered ()

kjer e.FirstName.StartsWith ("J")

izberite e;

Vrstni red podatkov, ki se vrnejo kot rezultat izvajanja poizvedbe PLINQ, lahko ohranite tudi tako, da QueryOptions.PreserveOrdering kot parameter uporabite metodo AsParallel.

var podatki = od e pri zaposlenih.AsParallel (QueryOptions.PreserveOrdering)

kjer e.FirstName.StartsWith ("J")

izberite e;

Upoštevajte, da uporaba metode AsParallel () za majhne zbirke ni priporočljiva - v primerjavi z običajno poizvedbo bi raje delovala počasneje. Kaj če želite vsiliti vzporednost? To sicer ni priporočljivo, vendar lahko to dosežete s pomočjo metode razširitve WithExecutionMode. Tu je primer, ki to ponazarja.

var podatki = od e pri zaposlenih.AsParallel (). WithExecutionMode

(ParallelExecutionMode.ForceParallelism)

kjer e.FirstName.StartsWith ("J")

izberite e;

Upoštevajte, da je ParallelExecutionMode naštevanje, ki je na voljo kot del imenskega prostora System.Linq in ima lahko eno od teh vrednosti: Default in ForceParallelism. Če kot parameter določite privzeto metodo razširitve WithExecutionMode, bo PLINQ poizvedbo izvedel vzporedno, če je opazno izboljšanje zmogljivosti pri vzporednem izvajanju poizvedbe. V nasprotnem primeru bi PLINQ poizvedbo izvedel tako kot poizvedbo LINQ. Nasprotno, če podate ForeParallelism kot parameter za razširitveno metodo WithExecutionMode, bi PLINQ poizvedbo izvedel vzporedno, tudi če bi to lahko povzročilo kazen uspešnosti.

Kako omejim stopnjo vzporednosti?

Zavedati se morate tudi drugega sorodnega koncepta: stopnja vzporednosti. To je nepodpisano celoštevilsko število, ki označuje največje število procesorjev, ki bi jih vaša poizvedba PLINQ morala izkoristiti med izvajanjem. Z drugimi besedami, stopnja vzporednosti je celo število, ki označuje največje število nalog, ki bi bile izvedene hkrati za obdelavo poizvedbe.

Mimogrede, privzeta vrednost stopnje vzporednosti je 64, kar pomeni, da lahko PLINQ izkoristi največ 64 procesorjev v vašem sistemu. Tukaj je opisano, kako lahko stopnjo vzporednosti v PLINQ omejite na dva procesorja v vašem sistemu.

var podatki = od e pri zaposlenih.AsParallel (). WithDegreeOfParallelism (2)

kjer e.FirstName.StartsWith ("J")

izberite e;

Upoštevajte, kako je bilo število procesorjev posredovanih kot argument metodi WithDegreeofParallelism. Določite višjo vrednost za stopnjo vzporednosti za povečanje zmogljivosti, če vaša poizvedba opravlja več neizračunanih, tj. Ne-CPU vezanih del.

Toplo priporočam branje dokumenta "Vzorci vzporednega programiranja" avtorja Stephena Touba. Ponuja poglobljeno razpravo o vzporednih vzorcih programiranja v .Net.