2013-11-20 16 views
14

Scala fornisce un modo per eseguire operazioni di mappe parallele come parte della lingua standard?Operazioni sulla mappa parallela?

Ad esempio, dato:

scala> val a = List((1,2), (3,4), (3,6)) 
a: List[(Int, Int)] = List((1,2), (3,4), (3,6)) 

posso fare:

scala> a.map(tup => tup._1 + tup._2) 
res0: List[Int] = List(3, 7, 9) 

Tuttavia, al meglio delle mie conoscenze questa mappa la funzione fornita oltre l'elenco degli oggetti in modo sequenziale. Esiste un modo integrato per applicare la funzione a ciascun elemento in un thread separato (o equivalente) e i risultati raccolti in un elenco risultante?

+2

Non usare 'list' per le operazioni distribuite (' par'). Dovresti usare un 'IndexedSeq'. – senia

+0

@senia - puoi solo approfondire il motivo per cui utilizzare un elenco è una cattiva idea in questo caso? Non ho bisogno che la lista risultante sia ordinata in alcun modo. – csvan

+5

È a causa del modo in cui il metodo 'par' crea' raccolta parallela'. Per 'Vector' (implementazione predefinita di 'IndexedSeq'),' Range' e 'Array', essa avvolge solo la raccolta iniziale con un wrapper leggero. Ma per 'List' dovrebbe creare una collezione completamente nuova, potrebbe portare a problemi di prestazioni. Vedi [Creating a Parallel Collection] (http://docs.scala-lang.org/overviews/parallel-collections/overview.html#creating_a_parallel_collection). – senia

risposta

25

Se si aggiunge par, si otterrà una raccolta parallela e le operazioni su di esso verranno elaborate in parallelo. Per riconvertire in una raccolta normale chiamare toList.

Quindi il codice sarà simile:

a.par.map(tup => tup._1 + tup._2).toList 

Also, check the documentation.

7

par suddivide l'elenco per l'elaborazione su più thread. È quindi possibile regolare il modo in cui il threading viene eseguito modificando il membro tasksupport del risultante ParSeq.