2011-03-24 17 views
36

¿Hay algún equivalente en colecciones paralelas de scala en LINQ's withDegreeOfParallelism que establezca el número de hilos que ejecutarán una consulta? Quiero ejecutar una operación en paralelo que necesita tener un número determinado de subprocesos en ejecución.colecciones paralelas de scala grado de paralelismo

Respuesta

55

Con el nuevo tronco, usando la JVM 1.6 o posterior, utilice el:

collection.parallel.ForkJoinTasks.defaultForkJoinPool.setParallelism(parlevel: Int) 

Esto puede ser un tema a los cambios en el futuro, sin embargo. Se planea un enfoque más unificado para configurar todas las API paralelas de tareas de Scala para las próximas versiones.

Tenga en cuenta, sin embargo, que si bien esto determinará la cantidad de procesadores que utiliza la consulta, esta puede no ser la cantidad real de subprocesos involucrados al ejecutar una consulta. Como las colecciones paralelas admiten el paralelismo anidado, la implementación del grupo de subprocesos real puede asignar más subprocesos para ejecutar la consulta si detecta que es necesario.

EDIT:

partir de Scala 2,10, la forma preferida de ajustar el nivel de paralelismo es a través de la configuración del campo tasksupport a un nuevo TaskSupport objeto, como en el siguiente ejemplo:

scala> import scala.collection.parallel._ 
import scala.collection.parallel._ 

scala> val pc = mutable.ParArray(1, 2, 3) 
pc: scala.collection.parallel.mutable.ParArray[Int] = ParArray(1, 2, 3) 

scala> pc.tasksupport = new ForkJoinTaskSupport(new scala.concurrent.forkjoin.ForkJoinPool(2)) 
pc.tasksupport: scala.collection.parallel.TaskSupport = [email protected] 

scala> pc map { _ + 1 } 
res0: scala.collection.parallel.mutable.ParArray[Int] = ParArray(2, 3, 4) 

Mientras instanciar el objeto ForkJoinTaskSupport con un conjunto de unión de horquilla, el nivel de paralelismo del conjunto de unión de horquilla debe establecerse en el valor deseado (2 en el ejemplo).

5

Independientemente de la versión de la JVM, la Scala 2.9 + (introducido colecciones paralelas), también se puede utilizar una combinación de los grouped(Int) y par funciones para ejecutar trabajos paralelos en trozos pequeños, como este:

scala> val c = 1 to 5 
c: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5) 

scala> c.grouped(2).seq.flatMap(_.par.map(_ * 2)).toList 
res11: List[Int] = List(2, 4, 6, 8, 10) 

grouped(2) crea trozos de longitud 2 o menos, seq asegura que la colección de trozos no es paralela (inútil en este ejemplo), entonces la función _ * 2 se ejecuta en los pequeños trozos paralelos (creados con par), asegurando que como máximo 2 subprocesos se ejecuta en paralelo.

Sin embargo, esto podría ser un poco menos eficiente que establecer el parámetro del grupo de trabajadores, no estoy seguro de eso.

+0

Soy escéptico de que esto realmente te gane algo. Tendría que ver que los números de referencia lo demostraran. –

Cuestiones relacionadas