2012-04-07 21 views
11

Digamos que tengo una lista de cadenas bastante grande (varios millones de elementos, aproximadamente). ¿Es una buena idea ejecutar algo como esto:¿Es una buena idea ejecutar `... par.map (` en listas grandes directamente?

val updatedList = myList.par.map(someAction).toList 

O sería una mejor idea de agrupar la lista antes de ejecutar ...par.map(, así:

val numberOfCores = Runtime.getRuntime.availableProcessors 
val updatedList = 
    myList.grouped(numberOfCores).toList.par.map(_.map(someAction)).toList.flatten 

ACTUALIZACIÓN: Dado que someAction es bastante caro (comparado con grouped , toList, etc.)

Respuesta

14

Ejecute par.map directamente, ya que tiene en cuenta el número de núcleos. Sin embargo, no guarde List, ya que eso requiere una copia completa para formar una colección paralela. En su lugar, use Vector.

8

Como se sugiere, evite el uso de listas y par, ya que eso implica copiar la lista en una colección que se puede atravesar fácilmente en paralelo. Vea el Parallel Collections Overview para una explicación.

Como se describe en el section on concrete parallel collection classes, un ParVector puede ser menos eficiente para el funcionamiento de un mapParArray, por lo que si usted está realmente preocupado por el rendimiento, puede tener sentido utilizar una matriz paralela.

Pero, si someAction es lo suficientemente caro, entonces su costo computacional ocultará los cuellos de botella secuenciales en toList y par.

Cuestiones relacionadas