Programavimas

Kaip dirbti su „Parallel LINQ“ C #

Integruota kalbos užklausa, taip pat žinoma kaip LINQ, yra užklausos vykdymo procesas, kuris prideda užklausos galimybių kalboms, nukreiptoms į valdomą .Net aplinką. „Parallel LINQ“ arba „PLINQ“ yra užklausos vykdymo variklis, veikiantis valdomos „Net“ aplinkos viršuje ir pasinaudojantis keliais jūsų kompiuterio sistemos procesoriais ar branduoliais, vykdant užklausas lygiagrečiai. Kitaip tariant, tai leidžia optimizuoti savo užklausas, suskaidant jas į dalis, kad šios dalys būtų vykdomos lygiagrečiai ir taip padidintų užklausos našumą.

PLINQ yra LINQ plėtinys ir buvo pristatytas kaip .Net Framework 4 dalis. Tai yra „Microsoft“ užklausų vykdymo variklis ir yra lygiagrečių plėtinių bibliotekos dalis. Savo ruožtu lygiagrečių plėtinių biblioteką sudaro TPL (Task Parallel Library) ir PLINQ. „Microsoft“ teikė palaikymą lygiagrečiam programavimui „.Net Framework“ sistemoje, kad galėtų pasinaudoti kelių branduolių sistemų pranašumais. Norint pasinaudoti lygiagrečių programavimo galimybėmis, „.Net Framework 4“ buvo pristatyta nauja klasė pavadinimu „Parallel“.

PLINQ yra geras pasirinkimas skaičiuojant susietas operacijas. Bet kas tai yra ir kokias problemas tai gali išspręsti? Ar tikslinga jį naudoti vietoj LINQ, kai mums reikia pateikti duomenų užklausą? Mes aptartume visa tai per akimirką, bet pirmiausia supraskime, kaip PLINQ veikia užkulisiuose. PLINQ veikia suskirstydamas duomenų šaltinį arba įvestį į dalis, kurias savo ruožtu vykdo skirtingos gijos.

Šiek tiek kodo dabar

Apsvarstykite šią LINQ užklausą.

var duomenys = nuo e darbuotojams

kur e.FirstName.StartsWith („J“)

pasirinkti e;

Aukščiau pateiktą užklausą galite lengvai konvertuoti į PLINQ užklausą naudodami „AsParallel“ plėtotės metodą. Atkreipkite dėmesį, kad „AsParallel“ yra „System.Linq.ParallelEnumerable“ klasės išplėtimo metodas.

var duomenys = iš e darbuotojams. AsParallel ()

kur e.FirstName.StartsWith („J“)

pasirinkti e;

Jei norite išsaugoti užklausos rezultatų tvarką, galite pasinaudoti „AsOrdered“ metodu.

var duomenys = iš e darbuotojams. AsParallel (). AsOrdered ()

kur e.FirstName.StartsWith („J“)

pasirinkti e;

Taip pat galite išsaugoti duomenų, kurie grąžinami vykdant PLINQ užklausą, tvarką perduodant QueryOptions.PreserveOrdering kaip parametrą AsParallel metodui.

var duomenys = iš e darbuotojams. AsParallel (QueryOptions.PreserveOrdering)

kur e.FirstName.StartsWith („J“)

pasirinkti e;

Atkreipkite dėmesį, kad nedidelėse kolekcijose nepatartina naudoti „AsParallel“ () metodo - jis veiktų lėčiau, palyginti su įprasta užklausa. Ką daryti, jei norite priversti paralelizmą? Vis dėlto tai nerekomenduojama, tačiau galite tai padaryti naudodami „WithExecutionMode“ plėtinio metodą. Štai pavyzdys, kuris tai iliustruoja.

var duomenys = iš e darbuotojams. AsParallel (). WithExecutionMode

(ParallelExecutionMode.ForceParallelism)

kur e.FirstName.StartsWith („J“)

pasirinkti e;

Atminkite, kad „ParallelExecutionMode“ yra išvardijimas, kuris yra prieinamas kaip „System.Linq“ vardų srities dalis ir gali turėti vieną iš šių reikšmių: „Default“ ir „ForceParallelism“. Jei kaip „WithExecutionMode“ plėtinio metodo parametrą nurodote Numatytasis, PLINQ vykdys užklausą lygiagrečiai, jei akivaizdžiai pagerės našumas vykdant užklausą lygiagrečiai. Jei ne, PLINQ vykdys užklausą taip, kaip ir LINQ užklausa. Priešingai, jei nurodysite „ForeParallelism“ kaip „WithExecutionMode“ plėtinio metodo parametrą, PLINQ vykdys užklausą lygiagrečiai, net jei už tai gali būti skiriama bauda.

Kaip apriboti lygiagretumo laipsnį?

Jūs taip pat turėtumėte žinoti apie kitą susijusią sąvoką: lygiagretumo laipsnį. Tai yra nepasirašytas sveikasis skaičius, žymintis maksimalų procesorių skaičių, kuriuo turėtų pasinaudoti jūsų PLINQ užklausa, kol ji vykdoma. Kitaip tariant, lygiagretumo laipsnis yra sveikas skaičius, žymintis maksimalų užduočių, kurios būtų vienu metu vykdomos užklausai apdoroti, skaičių.

Beje, numatytoji lygiagretumo laipsnio vertė yra 64, o tai reiškia, kad PLINQ gali naudoti ne daugiau kaip 64 jūsų sistemos procesorius. Štai kaip galite apriboti PLINQ lygiagretumo laipsnį dviem procesoriais jūsų sistemoje.

var duomenys = iš e darbuotojams. AsParallel (). WithDegreeOfParallelism (2)

kur e.FirstName.StartsWith („J“)

pasirinkti e;

Atkreipkite dėmesį, kaip procesorių skaičius buvo perduotas kaip argumentas „WithDegreeofParallelism“ metodui. Turėtumėte nurodyti didesnę lygiagretumo laipsnio vertę, kad padidėtų našumas, jei jūsų užklausa atlieka daugiau nesusijusių, t. Y. Su CPU nesusijusių, darbų.

Labai rekomenduoju perskaityti Stepheno Toubo dokumentą „Lygiagretaus programavimo modeliai“. Tai suteikia išsamią diskusiją apie lygiagrečius programavimo modelius .Net.