Programování

Jak pracovat s Parallel LINQ v C #

Language Integrated Query, také známý jako LINQ, je kanál pro provádění dotazů, který přidává možnosti dotazu do jazyků cílených na spravované prostředí .Net. Parallel LINQ, nebo PLINQ, je stroj pro provádění dotazů, který běží na vrcholu spravovaného prostředí .Net a využívá výhod více procesorů nebo jader ve vašem počítačovém systému k paralelnímu provádění dotazů. Jinými slovy, umožňuje vám optimalizovat vaše dotazy jejich rozdělením na části, aby se tyto části spouštěly paralelně, a tím zvyšovaly výkon dotazu.

PLINQ je rozšíření LINQ a bylo zavedeno jako součást .Net Framework 4. Jedná se o stroj pro provádění dotazů od společnosti Microsoft a je součástí knihovny paralelních rozšíření. Knihovna paralelních rozšíření je zase složena z TPL (Task Parallel Library) a PLINQ. Microsoft poskytl podporu pro paralelní programování v .Net Framework, aby využil výhody vícejádrových systémů. Aby bylo možné využívat výhod funkcí paralelního programování, byla v .Net Framework 4 zavedena nová třída s názvem Parallel.

PLINQ je dobrou volbou v operacích vázaných na výpočet. O co ale jde a jaké problémy může vyřešit? Je vhodné jej použít místo LINQ, kdykoli potřebujeme dotazovat data? O všem z nich bychom diskutovali za chvíli, ale pojďme nejprve pochopit, jak PLINQ funguje v zákulisí. PLINQ funguje rozdělením zdroje dat nebo vstupu na bloky, které jsou zase prováděny různými vlákny.

Trochu kódu hned

Zvažte následující dotaz LINQ.

var data = od e u zaměstnanců

kde e.FirstName.StartsWith ("J")

vyberte e;

Výše uvedený dotaz můžete snadno převést na dotaz PLINQ pomocí metody rozšíření AsParallel. Všimněte si, že AsParallel je metodou rozšíření třídy System.Linq.ParallelEnumerable.

var data = od e v zaměstnancích. AsParallel ()

kde e.FirstName.StartsWith ("J")

vyberte e;

Pokud chcete zachovat pořadí výsledku dotazu, můžete využít AsOrdered metodu.

var data = from e in employees.AsParallel (). AsOrdered ()

kde e.FirstName.StartsWith ("J")

vyberte e;

Můžete také zachovat pořadí dat, která jsou vrácena jako výsledek provedení dotazu PLINQ, předáním QueryOptions.PreserveOrdering jako parametru metodě AsParallel.

var data = from e in employees.AsParallel (QueryOptions.PreserveOrdering)

kde e.FirstName.StartsWith ("J")

vyberte e;

Všimněte si, že použití metody AsParallel () se nedoporučuje u malých kolekcí - raději by běželo pomaleji ve srovnání s běžným dotazem. Co když chcete vynutit paralelismus? To se nedoporučuje, ale k dosažení tohoto cíle můžete využít metodu rozšíření WithExecutionMode. Zde je příklad, který to ilustruje.

var data = from e in employees.AsParallel (). WithExecutionMode

(ParallelExecutionMode.ForceParallelism)

kde e.FirstName.StartsWith ("J")

vyberte e;

Všimněte si, že ParallelExecutionMode je výčet, který je k dispozici jako součást oboru názvů System.Linq a může mít jednu z těchto hodnot: Výchozí a ForceParallelism. Pokud zadáte Default jako parametr metody rozšíření WithExecutionMode, PLINQ provede dotaz paralelně, pokud je zřejmé zlepšení výkonu při paralelním provádění dotazu. Pokud ne, PLINQ provede dotaz stejně jako dotaz LINQ. Naopak, pokud zadáte ForeParallelism jako parametr metody rozšíření WithExecutionMode, PLINQ by provedl dotaz paralelně, i když by to mohlo způsobit trest výkonu.

Jak omezím míru paralelismu?

Měli byste také vědět o dalším souvisejícím konceptu: míře paralelismu. Toto je celé číslo bez znaménka, které označuje maximální počet procesorů, které by měl váš dotaz PLINQ využít, když je v provádění. Jinými slovy, stupeň paralelismu je celé číslo, které označuje maximální počet úkolů, které by byly provedeny současně ke zpracování dotazu.

Mimochodem, výchozí hodnota stupně paralelismu je 64, což znamená, že PLINQ může ve vašem systému využít maximálně 64 procesorů. Tady je příklad, jak můžete omezit stupeň paralelismu v PLINQ na dva procesory ve vašem systému.

var data = from e in employees.AsParallel (). WithDegreeOfParallelism (2)

kde e.FirstName.StartsWith ("J")

vyberte e;

Všimněte si, jak byl počet procesorů předán jako argument metodě WithDegreeofParallelism. Měli byste určit vyšší hodnotu pro stupeň paralelismu pro zvýšení výkonu, pokud váš dotaz provádí více vázané na výpočet, tj. Na práci bez vázaného na CPU.

Vřele doporučuji přečíst si dokument „Patterns of Parallel Programming“ od Stephena Toub. Poskytuje podrobnou diskusi o vzorcích paralelního programování v .Net.