Programovanie

Ako pracovať s Parallel LINQ v C #

Language Integrated Query, tiež známy ako LINQ, je potrubie na vykonávanie dotazov, ktoré pridáva možnosti dotazu do jazykov zameraných na spravované prostredie .Net. Parallel LINQ, alebo PLINQ, je stroj na vykonávanie dotazov, ktorý beží nad spravovaným prostredím .Net a využíva paralelné vykonávanie dotazov z viacerých procesorov alebo jadier vo vašom počítačovom systéme. Inými slovami, umožňuje vám optimalizovať vaše dotazy ich rozdelením na časti, aby sa tieto časti vykonávali paralelne, a tým zvyšovali výkonnosť dotazu.

PLINQ je rozšírenie k LINQ a bolo predstavené ako súčasť .Net Framework 4. Je to stroj na vykonávanie dotazov od spoločnosti Microsoft a je súčasťou knižnice Parallel Extensions Library. Knižnica paralelných rozšírení je zase zložená z TPL (paralelná knižnica úloh) a PLINQ. Spoločnosť Microsoft poskytla podporu pre paralelné programovanie v rámci .NET Framework s cieľom využiť výhody viacjadrových systémov. Aby sa využili možnosti paralelného programovania, bola v .Net Framework 4 zavedená nová trieda s názvom Parallel.

PLINQ je dobrou voľbou v operáciách viazaných na výpočet. O čo však ide a aké sú problémy, ktoré dokáže vyriešiť? Je vhodné ho použiť namiesto LINQ, kedykoľvek potrebujeme vyhľadávať údaje? O všetkom by sme diskutovali za chvíľu, ale najskôr pochopíme, ako PLINQ funguje v zákulisí. PLINQ funguje tak, že rozdeľuje zdroj údajov alebo vstup na bloky, ktoré sa naopak vykonávajú rôznymi vláknami.

Teraz trochu kódu

Zvážte nasledujúci dotaz LINQ.

var data = od e v zamestnancoch

kde e.FirstName.StartsWith ("J")

vyberte e;

Vyššie uvedený dotaz môžete ľahko previesť na dotaz PLINQ pomocou metódy rozšírenia AsParallel. Všimnite si, že AsParallel je rozšírená metóda triedy System.Linq.ParallelEnumerable.

var data = z e v zamestnancoch. AsParallel ()

kde e.FirstName.StartsWith ("J")

vyberte e;

Ak chcete zachovať poradie výsledku dotazu, môžete využiť metódu AsOrdered.

var data = z e v zamestnancoch. AsParallel (). AsOrdered ()

kde e.FirstName.StartsWith ("J")

vyberte e;

Môžete tiež zachovať poradie údajov vrátených v dôsledku vykonania dotazu PLINQ odovzdaním QueryOptions.PreserveOrdering ako parametra metóde AsParallel.

var data = od e v zamestnancoch. AsParallel (QueryOptions.PreserveOrdering)

kde e.FirstName.StartsWith ("J")

vyberte e;

Upozorňujeme, že použitie metódy AsParallel () sa v malých zbierkach neodporúča - v porovnaní s bežným dotazom by radšej bežalo pomalšie. Čo ak chcete vynútiť paralelizmus? To sa však neodporúča, ale môžete to dosiahnuť pomocou metódy rozšírenia WithExecutionMode. Toto je príklad, ktorý to ilustruje.

var data = z e v zamestnancoch. AsParallel (). WithExecutionMode

(ParallelExecutionMode.ForceParallelism)

kde e.FirstName.StartsWith ("J")

vyberte e;

Upozorňujeme, že ParallelExecutionMode je výčet, ktorý je k dispozícii ako súčasť menného priestoru System.Linq a môže mať jednu z týchto hodnôt: Predvolené a ForceParallelism. Ak zadáte Default ako parameter pre metódu rozšírenia WithExecutionMode, PLINQ vykoná dotaz paralelne, ak je pri paralelnom vykonávaní dotazu zrejmé zlepšenie výkonu. Ak nie, PLINQ vykoná dotaz rovnako ako LINQ dotaz. Naopak, ak zadáte ForeParallelism ako parameter pre metódu rozšírenia WithExecutionMode, PLINQ by vykonal dotaz paralelne, aj keď by to mohlo spôsobiť výkonnostný trest.

Ako obmedzím mieru paralelizmu?

Mali by ste tiež vedieť o ďalšom súvisiacom koncepte: stupni paralelizmu. Toto je celé číslo bez znamienka, ktoré označuje maximálny počet procesorov, ktoré by váš dotaz PLINQ mal počas vykonávania využiť. Inými slovami, stupeň paralelizmu je celé číslo, ktoré označuje maximálny počet úloh, ktoré by sa vykonali súčasne na spracovanie dotazu.

Predvolená hodnota stupňa paralelizmu je 64, čo znamená, že PLINQ môže vo vašom systéme využívať maximálne 64 procesorov. Tu je príklad, ako môžete obmedziť stupeň paralelizmu v PLINQ na dva procesory vo vašom systéme.

var data = z e v zamestnancoch. AsParallel (). WithDegreeOfParallelism (2)

kde e.FirstName.StartsWith ("J")

vyberte e;

Všimnite si, ako bol počet procesorov odovzdaný ako argument metóde WithDegreeofParallelism. Mali by ste určiť vyššiu hodnotu pre stupeň paralelizmu pre zvýšenie výkonu, ak váš dopyt vykonáva prácu viazanú na iné výpočty, t. J. Prácu neviazanú na CPU.

Vrelo odporúčam prečítať si dokument „Patterns of Parallel Programming“ od Stephena Toubu. Poskytuje podrobnú diskusiu o vzoroch paralelného programovania v .Net.

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