Možnosti sloučení v PLINQ
Při provádění dotazu paralelně, PLINQ rozdělí zdrojovou sekvenci tak, aby více vláken mohlo pracovat na různých částech souběžně, obvykle na oddělených vláknech. Jsou-li výsledky spotřebovávaný v jednom vláknu, například v foreach (For Each v Visual Basic) smyčce, pak musí být výsledky z každého vlákno sloučen zpět do jedné sekvence. Typ sloučení, který provádí PLINQ, závisí na operátorech, která jsou přítomné v dotazu. Například operátory, které zavádí nové třidění na výsledky, musí do vyrovnávací paměti nahrát všechny prvky ze všech vláken. Z hlediska vlákna, které spotřebovává výsledky (což je také uživatel aplikace), může dotaz, který je plně načtený do paměti, běžet znatelnou dobu před tím než vyrobí první výsledek. Jiné operátory jsou ve výchozím nastavení částečně načteny do paměti. Dávají výsledky v dávkách. Jeden operátor ForAll<TSource> je vyrovnávací paměti při výchozím nastavení. Dává všechny elementy, ze všech vláken okamžitě.
Pomocí WithMergeOptions<TSource> způsob, jak je znázorněno v následujícím příkladu můžete poskytnout nápovědu PLINQ označující druh provést sloučení.
Dim scanlines = From n In nums.AsParallel().WithMergeOptions(ParallelMergeOptions.NotBuffered)
Where n Mod 2 = 0
Select ExpensiveFunc(n)
var scanLines = from n in nums.AsParallel()
.WithMergeOptions(ParallelMergeOptions.NotBuffered)
where n % 2 == 0
select ExpensiveFunc(n);
Pro plný příklad, viz Postupy: Určení možností sloučení v PLINQ.
Pokud některé dotazy nepodporují požadovanou možnost, pak možnost bude ignorována. Ve většině případů není nutné zadávat možnost sloučení pro PLINQ dotaz. Nicméně v některých případech můžete zjistit pomocí testování a měření, že dotaz je nejlépe prováděn v jiném režimu než výchozí. Společné použití této možnosti je k vynucení posílání výsledku z operátoru "chunk-merging" do datového proudu s cílem poskytnout rychleji reagující uživatelské rozhraní.
ParallelMergeOptions
Výčet ParallelMergeOptions obsahuje následující volby, které určující, pro podporované tvary dotazu, jak je získán konečný výstup dotazu, když je výsledek zpracován v jednom vlákně.
Not Buffered
NotBuffered Možnost způsobí, že každý prvek zpracovaných vrátit co nejdříve se vyrábí z každého podprocesu. Toto chování je obdobné k "vysílání" výstupu. Pokud je AsOrdered() operátor v dotazu, NotBuffered zachová se pořadí zdrojových prvků. Přestože NotBuffered začne vracet výsledky ihned jakmile jsou k dispozici, celkový čas k výrobě všech výsledků může být stále delší než pří použití jedné z dalších možností sloučení.
Auto Buffered
AutoBuffered Možnost způsobí, že dotaz shromáždit prvky do vyrovnávací paměti a pravidelně poskytují obsah vyrovnávací paměti najednou tak náročné podprocesu. Toto je analogická k vracení zdrojových data v blocích namísto využívání proudového chování NotBuffered. AutoBuffered může trvat déle vytvoření prvního elementu, přístupného pro spotřebitelské vlákno, než NotBuffered . Velikost vyrovnávací paměti a přesné chování vracení výsledku není konfigurovatelné a může se lišit v závislosti na různých faktorech, které se vztahují k dotaz.
FullyBuffered
FullyBuffered Možnost způsobí, že výstup celý dotaz do vyrovnávací paměti před výsledkem prvky chybná. Použijete-li tuto možnost, může trvat delší dobu než je první element k dispozici v spotřebitelském vlákně, ale celkový výsledek může být vytvořen rychleji než pří použití jiných možností.
Operátory dotazů, které podporují možnosti sloučení
V následující tabulce jsou uvedeny operátory, které podporují všechny režimy nastavení, s přihlédnutím k specifikovaným omezením.
Operátor |
Omezení |
---|---|
Žádné |
|
Žádné |
|
Neseřízené dotazy, které mají jako zdroj pouze pole nebo seznamu. |
|
Žádné |
|
Žádné |
|
Neseřízené dotazy, které mají jako zdroj pouze pole nebo seznamu. |
|
Žádné |
|
Žádné |
|
Žádné |
|
Žádné |
|
Žádné |
Všechny jiné operátory dotazů PLINQ můžou ignorovat uživatelem zadané možnosti sloučení. Některé operátory dotazů, jako například Reverse<TSource> a OrderBy, nemůžou vracet prvky, dokud nebyly všechny vyrobeny a přeuspořádány. Proto, když ParallelMergeOptions je používán v dotazu, který také obsahuje například operátor Reverse<TSource>, chování sloučení se neprojeví v dotazu, dokud tento operátor nevyrobí svůj výsledek.
Možnost některé operátory zpracování korespondence možnosti závisí na typu zdroje sekvence a zda AsOrdered operátor byl použit v dotazu. ForAll<TSource>vždy je NotBuffered ; okamžitě ji výnosů jeho prvky. OrderByvždy je FullyBuffered; před jeho výnosy ji musí celý seznam seřadit.
Viz také
Úkoly
Postupy: Určení možností sloučení v PLINQ