2011-05-26 14 views
5

Cuando se tiene una matriz de objetos, a menudo es deseable (por ejemplo, por motivos de rendimiento) actualizar (reemplazar) algunos de los objetos en su lugar. Por ejemplo, si tiene una matriz de enteros, es posible que desee reemplazar los números enteros negativos por positivos:Transformación de matrices en contexto con colecciones paralelas

// Faster for primitives 
var i = 0 
while (i < a.length) { 
    if (a(i) < 0) a(i) = -a(i) 
    i += 1 
} 

// Fine for objects, often okay for primitives 
for (i <- a.indices) if (a(i) < 0) a(i) = -a(i) 

Cuál es la forma canónica para llevar a cabo una modificación como esta utilizando la biblioteca de colecciones paralelo?

+0

En caso de que alguien se pregunte, aunque parezca que debería, en realidad no tengo la respuesta (solo conjeturas), ¡así que esta vez no responderé mi propia pregunta! –

Respuesta

5

En cuanto a las matrices en paralelo se consideran, es un descuido. Un paralelo transform para matrices paralelas probablemente se incluirá en la próxima versión.

Puede, sin embargo, hacerlo mediante una serie paralela:

for (i <- (0 until a.length).par) a(i) = computeSomething(i) 

Tenga en cuenta que no todas las colecciones mutables son modificables en su lugar de esta manera. En general, si desea modificar algo en su lugar, debe asegurarse de que esté sincronizado correctamente. Esto no es un problema para las matrices en este caso, ya que los diferentes índices modificarán diferentes elementos de la matriz (y los cambios son visibles para la persona que llama al final, ya que la finalización de una operación paralela garantiza que todas las escrituras sean visibles para la persona que llama).

2

Las colecciones mutables secuenciales tienen métodos como transform que funcionan in situ.

Paralelamente las colecciones mutables carecen de estos métodos, pero no estoy seguro de que haya una razón detrás o si solo se trata de un descuido.

Mi respuesta es que actualmente no tienes suerte, pero podrías escribirla tú mismo por supuesto.

¿Tal vez tendría sentido presentar una solicitud después de que se haya discutido un poco más?

2

¿Qué tal crear una colección paralela que contenga los índices en la matriz para transformar y luego ejecutar foreach para mutar una celda en una matriz, dado el índice.

De esta manera también tiene más control y es posible hacer cuatro trabajadores que funcionen en los cuatro cuartos de una matriz. Porque simplemente voltear un solo signo entero probablemente no sea suficiente para justificar un cálculo paralelo.

+0

Esto depende del tamaño de su matriz; si es realmente grande, entonces podría tener sentido. – axel22

+0

Corrección: si crea una colección paralela de índices, entonces probablemente no, pero podría usar un 'ParRange'. – axel22

Cuestiones relacionadas