Ohjelmointi

Kuinka työskennellä Parallel LINQ: n kanssa C #: ssä

Kielen integroitu kysely, joka tunnetaan myös nimellä LINQ, on kyselyn suoritusputki, joka lisää kyselyominaisuudet kielille, jotka on kohdistettu .Net-hallittuun ympäristöön. Parallel LINQ tai PLINQ on kyselyn suoritusmoottori, joka toimii .Net-järjestelmän hallitun ympäristön päällä ja hyödyntää tietokonejärjestelmän useita prosessoreita tai ytimiä suorittaakseen kyselyt rinnakkain. Toisin sanoen, sen avulla voit optimoida kyselysi jakamalla ne osiin, jotta nämä osat voidaan suorittaa samanaikaisesti ja siten parantaa kyselyn suorituskykyä.

PLINQ on LINQ: n laajennus, joka otettiin käyttöön osana .Net Framework 4: ää. Se on Microsoftin kyselyn suoritusmoottori ja osa Parallel Extensions Library -kirjastoa. Rinnakkaislaajennuskirjasto koostuu puolestaan ​​TPL: stä (Task Parallel Library) ja PLINQ: sta. Microsoft on tukenut rinnakkaista ohjelmointia .Net Frameworkissa hyödyntääkseen moniydinjärjestelmien edut. Rinnakkaisohjelmointimahdollisuuksien hyödyntämiseksi .NET Framework 4 otettiin käyttöön uusi ryhmä nimeltä Parallel.

PLINQ on hyvä valinta laskentaan sidotuissa operaatioissa. Mutta mistä on kyse ja mitkä ongelmat se voi ratkaista? Onko tarkoituksenmukaista käyttää sitä LINQ: n sijaan aina, kun meidän on kysyttävä tietoja? Keskustelemme kaikista näistä hetkessä, mutta ymmärretään ensin, kuinka PLINQ toimii kulissien takana. PLINQ toimii jakamalla tietolähde tai syöte paloiksi, jotka puolestaan ​​toteutetaan eri säikeillä.

Hieman koodia nyt

Harkitse seuraavaa LINQ-kyselyä.

var data = e työntekijöissä

missä e.Etunimi.StartsWith ("J")

valitse e;

Voit muuntaa yllä olevan kyselyn helposti PLINQ-kyselyksi käyttämällä AsParallel-laajennusmenetelmää. Huomaa, että AsParallel on System.Linq.ParallelEnumerable-luokan laajennusmenetelmä.

var data = e työntekijöiltä. AsParallel ()

missä e.Etunimi.StartsWith ("J")

valitse e;

Jos haluat säilyttää kyselytuloksen järjestyksen, voit hyödyntää AsOrdered-menetelmää.

var data = e työntekijöiltä. AsParallel (). AsOrdered ()

missä e.Etunimi.StartsWith ("J")

valitse e;

Voit myös säilyttää PLINQ-kyselyn suorittamisen seurauksena palautettujen tietojen järjestyksen välittämällä QueryOptions.PreserveOrdering-parametrin AsParallel-menetelmälle.

var data = e työntekijöiltä. asParallel (QueryOptions.PreserveOrdering)

missä e.Etunimi.StartsWith ("J")

valitse e;

Huomaa, että AsParallel () -menetelmän käyttö ei ole suositeltavaa pienissä kokoelmissa - se toimii mieluummin hitaammin kuin tavallinen kysely. Entä jos haluat pakottaa rinnakkaisuuden? Tätä ei kuitenkaan suositella, mutta voit hyödyntää WithExecutionMode-laajennusmenetelmää tämän saavuttamiseksi. Tässä on esimerkki, joka kuvaa tätä.

var data = e työntekijöistä. AsParallel (). WithExecutionMode

(ParallelExecutionMode.ForceParallelism)

missä e.Etunimi.StartsWith ("J")

valitse e;

Huomaa, että ParallelExecutionMode on luettelo, joka on saatavana osana System.Linq-nimiavaruutta ja jolla voi olla jokin seuraavista arvoista: Default ja ForceParallelism. Jos määrität oletusparametriksi WithExecutionMode-laajennusmenetelmälle, PLINQ suorittaa kyselyn rinnakkain, jos kysynnän rinnakkaisessa suorittamisessa ilmenee suorituskyvyn parannusta. Jos ei, PLINQ suorittaa kyselyn samalla tavalla kuin LINQ-kysely. Päinvastoin, jos määrität ForeParallelismin parametriksi WithExecutionMode-laajennusmenetelmälle, PLINQ suorittaa kyselyn rinnakkain, vaikka siitä aiheutuisi suoritusrangaistus.

Kuinka rajoitan rinnakkaisuuden astetta?

Sinun tulisi myös olla tietoinen toisesta asiaan liittyvästä käsitteestä: rinnakkaisuuden aste. Tämä on allekirjoittamaton kokonaisluku, joka ilmaisee suorittimien enimmäismäärän, jota PLINQ-kyselysi pitäisi hyödyntää, kun se on suorituksessa. Toisin sanoen rinnakkaisuuden aste on kokonaisluku, joka merkitsee enimmäismäärää tehtäviä, jotka suoritettaisiin samanaikaisesti kyselyn käsittelemiseksi.

Rinnakkaisuuden aste on oletusarvoisesti 64, mikä tarkoittaa, että PLINQ pystyy hyödyntämään enintään 64 prosessoria järjestelmässäsi. Näin voit rajoittaa PLINQ: n rinnakkaisuuden asteen kahteen prosessoriin järjestelmässäsi.

var data = e työntekijöiltä. AsParallel (). WithDegreeOfParallelism (2)

missä e.Etunimi.StartsWith ("J")

valitse e;

Huomaa, kuinka prosessoreiden määrä on välitetty argumenttina WithDegreeofParallelism -menetelmälle. Sinun tulisi määrittää suurempi arvo rinnakkaisuustasolle suorituskyvyn parantumiselle, jos kyselysi suorittaa enemmän ei laskennallista sidottua työtä, ts. Ei suoritinta.

Suosittelen lämpimästi Stephen Toubin julkaisua "Rinnakkaisohjelmoinnin mallit". Se tarjoaa perusteellisen keskustelun rinnakkaisista ohjelmointimalleista .Netissä.

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