concatenate scala scala-collections

concatenate - scala mutable collections



scala parallel collections grado de paralelismo (2)

¿Hay algún equivalente en las colecciones paralelas de scala en LINQ''s withDegreeOfParallelism que establece 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.


Con la troncal más nueva, utilizando el JVM 1.6 o posterior, use:

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

Sin embargo, esto puede estar sujeto a cambios en el futuro. Se planea un enfoque más unificado para configurar todas las API paralelas de tareas de Scala para las próximas versiones.

Sin embargo, tenga en cuenta que, si bien esto determinará la cantidad de procesadores que utiliza la consulta, esta puede no ser la cantidad real de subprocesos implicados en la ejecución de 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.

EDITAR:

A partir de Scala 2.10, la forma preferida de establecer el nivel de paralelismo es estableciendo el campo tasksupport en un nuevo objeto TaskSupport , 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 = scala.collection.parallel.ForkJoinTaskSupport@4a5d484a scala> pc map { _ + 1 } res0: scala.collection.parallel.mutable.ParArray[Int] = ParArray(2, 3, 4)

Al crear una instancia del 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).


Independientemente de la versión de JVM, con Scala 2.9+ (colecciones paralelas introducidas), también puede usar una combinación de las funciones grouped(Int) y par 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 así que como máximo 2 hilos 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.