2011-12-15 12 views
5

Ho una matrice numpy che mi piacerebbe condividere tra un gruppo di processi python in un modo che non implichi copie. Creo un array numpy condiviso da un array numpy esistente utilizzando il pacchetto sharedmem.Array Numpy accesso non contiguo condiviso

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 

Il mio problema è che ogni sottoprocesso deve accedere alle righe distribuite casualmente nell'array. Attualmente creo un array numpy condiviso usando il pacchetto sharedmem e lo passo ad ogni sottoprocesso. Ogni processo ha anche una lista, idx, di righe a cui ha bisogno di accedere. Il problema è nel sottoprocesso quando lo faccio:

#idx = list of randomly distributed integers 

local_array = shared_array[idx,:] 

# Do stuff with local array 

Si crea una copia della matrice invece di un'altra vista. La matrice è piuttosto grande e manipolarla prima shareing in modo che ogni processo accede a un intervallo contiguo di righe come

local_array = shared_array[start:stop,:] 

richiede troppo tempo.

Domanda: Quali sono le buone soluzioni per la condivisione dell'accesso casuale a una matrice numpy tra processi Python che non implicano la copia della matrice?

I sottoprocessi richiedono un accesso di sola lettura (quindi non è necessario il blocco dell'accesso).

+1

Per quello che vale, questo non ha nulla a che fare con la memoria condivisa. Gli array di Numpy devono essere contigui in memoria, quindi qualsiasi indicizzazione di fantasia (ad es. Indicizzazione con una matrice di indici) restituisce sempre una copia. Questo è vero per qualsiasi array numpy. O lavorare con blocchi più piccoli di indici o iterare, piuttosto che slice. –

+0

@JoeKington - Hai ragione. Il problema è con gli array numpy in generale. –

risposta

1

L'indicizzazione di fantasia induce una copia, quindi è necessario evitare l'indicizzazione di fantasia se si desidera evitare copie non c'è modo di aggirarlo.