Programmēšana

Kā strādāt ar Parallel LINQ C #

Valodu integrētais vaicājums, kas pazīstams arī kā LINQ, ir vaicājuma izpildes cauruļvads, kas vaicājuma iespējas pievieno valodām, kas mērķētas uz pārvaldīto .Net vidi. Parallel LINQ vai PLINQ ir vaicājumu izpildes dzinējs, kas darbojas virs pārvaldītās .Net vides un izmanto vairāku procesoru vai kodolu priekšrocības jūsu datorsistēmā, lai vaicājumus izpildītu paralēli. Citiem vārdiem sakot, tas ļauj optimizēt vaicājumus, sadalot tos daļās, lai šīs daļas izpildītu paralēli un tādējādi uzlabotu vaicājuma veiktspēju.

PLINQ ir LINQ paplašinājums, un tas tika ieviests kā daļa no .Net Framework 4. Tas ir vaicājumu izpildes dzinējs no Microsoft un ir daļa no Parallel Extensions Library. Paralēlo paplašinājumu bibliotēku savukārt veido TPL (Task Parallel Library) un PLINQ. Microsoft ir nodrošinājis atbalstu .Net Framework paralēlai programmēšanai, lai izmantotu daudzkodolu sistēmu priekšrocības. Lai izmantotu paralēlo programmēšanas iespējas, .Net Framework 4 tika ieviesta jauna klase ar nosaukumu Parallel.

PLINQ ir laba izvēle skaitļošanas saistītās darbībās. Bet par ko tas ir un kādas ir problēmas, kuras tas var atrisināt? Vai ir lietderīgi to izmantot LINQ vietā ikreiz, kad mums ir nepieciešams vaicāt datus? Mēs tos visus apspriedīsim vienā mirklī, bet vispirms sapratīsim, kā PLINQ darbojas aizkulisēs. PLINQ darbojas, sadalot datu avotu vai ievadi gabalos, kurus savukārt izpilda dažādi pavedieni.

Tagad mazliet koda

Apsveriet šādu LINQ vaicājumu.

var dati = no e darbiniekos

kur e.Vārds.Sākas ar ("J")

izvēlieties e;

Izmantojot paplašinājuma AsParallel metodi, iepriekš minēto vaicājumu var viegli pārveidot par PLINQ vaicājumu. Ņemiet vērā, ka AsParallel ir sistēmas System.Linq.ParallelEnumerable paplašināšanas metode.

var dati = no e darbiniekos. AsParallel ()

kur e.Vārds.Sākas ar ("J")

izvēlieties e;

Ja vēlaties saglabāt vaicājuma rezultāta secību, varat izmantot AsOrdered metodes priekšrocības.

var dati = no e darbiniekos. AsParallel (). AsOrdered ()

kur e.Vārds.Sākas ar ("J")

izvēlieties e;

Varat arī saglabāt datu secību, kas tiek atgriezta PLINQ vaicājuma izpildes rezultātā, nododot QueryOptions.PreserveOrdering kā parametru metodei AsParallel.

var dati = no e darbiniekos. AsParallel (QueryOptions.PreserveOrdering)

kur e.Vārds.Sākas ar ("J")

izvēlieties e;

Ņemiet vērā, ka mazām kolekcijām nav ieteicams izmantot AsParallel () metodi - tā drīzāk darbotos lēnāk, salīdzinot ar parasto vaicājumu. Ko darīt, ja vēlaties uzspiest paralēlismu? Tas gan nav ieteicams, taču, lai to panāktu, varat izmantot paplašināšanas metodi WithExecutionMode. Lūk, piemērs, kas to ilustrē.

var dati = no e darbiniekos. AsParallel (). WithExecutionMode

(ParallelExecutionMode.ForceParallelism)

kur e.Vārds.Sākas ar ("J")

izvēlieties e;

Ņemiet vērā, ka ParallelExecutionMode ir uzskaitījums, kas pieejams kā System.Linq nosaukumvietas daļa, un tam var būt viena no šīm vērtībām: Default un ForceParallelism. Ja kā parametru WithExecutionMode paplašinājuma metodei norādāt Noklusējums, PLINQ vaicājumu izpildīs paralēli, ja ir redzams veiktspējas uzlabojums, veicot vaicājumu paralēli. Ja nē, PLINQ izpildīs vaicājumu tāpat kā LINQ vaicājums. Gluži pretēji, ja jūs norādāt ForeParallelism kā parametru WithExecutionMode paplašināšanas metodei, PLINQ vaicājumu izpildītu paralēli, pat ja par to varētu maksāt izpildes sodu.

Kā es varu ierobežot paralelitātes pakāpi?

Jums jāzina arī cits saistīts jēdziens: paralelitātes pakāpe. Šis ir neparakstīts vesels skaitlis, kas apzīmē maksimālo procesoru skaitu, kuru PLINQ vaicājumam vajadzētu izmantot, kamēr tas tiek izpildīts. Citiem vārdiem sakot, paralelitātes pakāpe ir vesels skaitlis, kas apzīmē maksimālo uzdevumu skaitu, kas vienlaikus tiktu izpildīts, lai apstrādātu vaicājumu.

Starp citu, paralēluma pakāpes noklusējuma vērtība ir 64, kas nozīmē, ka PLINQ var izmantot ne vairāk kā 64 procesorus jūsu sistēmā. Lūk, kā jūs varat ierobežot paralelitātes pakāpi PLINQ līdz diviem jūsu sistēmas procesoriem.

var dati = no e darbiniekos. AsParallel (). WithDegreeOfParallelism (2)

kur e.Vārds.Sākas ar ("J")

izvēlieties e;

Ievērojiet, kā procesoru skaits ir nodots kā arguments WithDegreeofParallelism metodei. Ja jūsu vaicājums veic vairāk nesaistītu, t.i., ar CPU nesaistītu darbu, veiktspējas pieauguma paralelitātes pakāpei ir jānorāda augstāka vērtība.

Es ļoti iesaku izlasīt Stīvena Tūba dokumentu "Paralēlās programmēšanas modeļi". Tas sniedz padziļinātu diskusiju par paralēlajiem programmēšanas modeļiem .Net.

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