5

Al principio supuse que cada clase de colección recibiría un método adicional par que convertiría la colección en una estructura de datos paralelos adecuada (como map devuelve la mejor colección para el tipo de elemento en Scala 2.8).¿Cuál es la forma preferida de usar las colecciones paralelas en Scala?

Ahora parece que algunas clases de colección apoyar un método de par (e. G. Array) pero otros tienen toParSeq, toParIterable métodos (e. G. Lista). Esto es un poco raro, ya que Array no se usa o recomienda con frecuencia.

¿Cuál es la razón para eso? ¿No sería mejor tener un par disponible en todas las clases de colección haciendo lo "correcto"?

Si tengo datos que pueden procesarse en paralelo, ¿qué tipos debo usar? Los rasgos en scala.collection o el tipo de la implementación directamente?

¿O debería preferir Arrays ahora, porque parecen ser más baratas de paralelizar?

Respuesta

5

Las listas no son muy adecuadas para el procesamiento en paralelo. La razón es que para llegar al final de la lista, debe recorrer cada elemento. Por lo tanto, también puede tratar la lista como un iterador y, por lo tanto, también puede usar algo más genérico como toParIterable.

Cualquier colección que tenga un índice rápido es un buen candidato para el procesamiento en paralelo. Esto incluye todo lo que implemente LinearSeqOptimized, además de árboles y tablas hash. Array tiene el índice más rápido que puede obtener, por lo que es una opción bastante natural. También puede usar cosas como ArrayBuffer (que tiene un método par que devuelve ParArray).

+0

Esto parece como que solo hay un '.sorted' en' SeqLike', por lo que tienes que hacer 'items.toSeq.sorted' en lugar de solo' items.sorted'. Entonces, ¿por qué tener todos los métodos '.toParIterable' etc., en lugar de simplemente decirle a la gente que haga' items.toArray.par' cuando 'items' no es paralelizable? – Steve

+0

@Steve - Existe la posibilidad de que los métodos 'toParIterable' no tengan que hacer una copia de los datos subyacentes. Por lo tanto, aunque son lentas, ocasionalmente podrían ser un buen compromiso (por ejemplo, al atravesar la lista o lo que sea rápido en comparación con el cálculo en cada elemento de la lista). –

Cuestiones relacionadas