2011-12-15 11 views
5

Tengo una matriz numpy que me gustaría compartir entre un grupo de procesos de python de una manera que no implique copias. Creé una matriz numpy compartida a partir de una matriz numpy existente usando el paquete sharedmem.Matriz Numpy de acceso no contiguo compartida

import sharedmem as shm 
def convert_to_shared_array(A): 
    shared_array = shm.shared_empty(A.shape, A.dtype, order="C") 
    shared_array[...] = A 
    return shared_array 

Mi problema es que cada subproceso necesita acceder a filas que se distribuyen aleatoriamente en la matriz. Actualmente creo una matriz numpy compartida utilizando el paquete sharedmem y la paso a cada subproceso. Cada proceso también tiene una lista, idx, de filas a las que necesita acceder. El problema está en el subproceso cuando lo haga:

#idx = list of randomly distributed integers 

local_array = shared_array[idx,:] 

# Do stuff with local array 

Se crea una copia de la matriz en lugar de simplemente otro punto de vista. La matriz es bastante grande y manipulándolo primero antes de shareing de modo que cada proceso tiene acceso a un intervalo contiguo de filas como

local_array = shared_array[start:stop,:] 

lleva demasiado tiempo.

Pregunta: ¿Cuáles son buenas soluciones para compartir el acceso aleatorio a una matriz numpy entre procesos de python que no implican copiar la matriz?

Los subprocesos necesitan acceso de solo lectura (por lo que no es necesario bloquear el acceso).

+1

Para lo que sea, esto no tiene nada que ver con la memoria compartida. Las matrices de Numpy deben estar contiguas en la memoria, por lo que cualquier indización elegante (por ejemplo, indización con una matriz de indicios) siempre devuelve una copia. Esto es cierto para cualquier matriz numpy. O trabaje con trozos más pequeños de indices o itere, en lugar de cortar. –

+0

@JoeKington - Tienes razón. El problema es con las matrices numpy en general. –

Respuesta

1

La indización de fantasía induce una copia, por lo que debe evitar la indexación sofisticada si desea evitar copias no hay forma de evitarlo.

Cuestiones relacionadas