Parallel LINQ

in C#, Informatica

Parallel LINQ

Il Language Integrated Query o LINQ è utilizzato per eseguire query sui dati, all’interno di C#. Parallel Language Integrated Query consente di eseguire query in modalità parallela. A differenza delle query tradizionali utlizzando PLINQ l’esecuzione avviene in modalità parallela.

L’esecuzione di una query PLINQ è simile a quella LINQ, e può essere utilizzata su qualsiasi tipologia di dati IEnumerable o IEnumerable<T>.

In molti casi l’utilizzo di query in modalità parallela consente di ottimizzare i tempi di risposta dell’applicazione, andando a sfruttare tutti i core disponibili dal dispositivo.

Il metodo .AsParallel() esamina la query per determinare se usare l’equivalente versione parallela per velocizzare le operazioni. Nel caso in cui la query venga eseguita parallalmente, vengono generati n processi eseguiti contemporaneamente. Nel caso in cui il metodo decida che l’esecuzione in parallelo non porti ad un aumento delle performance, la query viene eseguita normalmente.

Nell’esempio precedente viene forzata l’esecuzione parallela: non è più il metodo AsParallel() a decidere in autonomia. Inoltre viene anche forzato il numero di processori che dovranno essere utilizzati (in questo caso 4).

Ordinamento e Sequenzialità

Una query non parallela produce in output dati che hanno lo stesso ordine dei dati in input. Quando si lavoro con query parallele, l’input può essere processato in ordine differente (dipende dal parallelismo) con un risultato differente rispetto ai dati in ingresso. Nel caso in cui sia importante mantenere l’ordine dei dati in ingresso è possibile utilizzare il metodo .AsOrdered(). Questo metodo non disabilita la parallelizzazione della query, semplicemente organizza l’output riportando lo stesso ordine dei dati in ingresso.

La natura di esecuzione parallela delle query può rimuovere l’ordine di esecuzione di query complesse. Il metodo .AsSequential() può essere utilizzato per eseguire parti di query in maniera sequenziale.

Da notare la differenza tra .AsSequential() e .AsOrdered(): il primo metodo esegue le query in ordine, mentre il secondo effettua il riodinamento dei dati in output, preservando l’esecuzione parallela.