Sto usando il modulo multiprocessing
di Python per elaborare array numpy di grandi dimensioni in parallelo. Gli array sono mappati in memoria usando numpy.load(mmap_mode='r')
nel processo master. Successivamente, multiprocessing.Pool()
avvia il processo (presumo).NumPy vs. multiprocessing e mmap
Tutto sembra funzionare bene, tranne io sono linee ottenendo come:
AttributeError ("oggetto 'NoneType' non ha alcun attributo 'dire'",) in
<bound method memmap.__del__ of memmap([ 0.57735026, 0.57735026, 0.57735026, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], dtype=float32)>
ignorato
nel registri di unittest. I test passano bene, tuttavia.
Qualche idea di cosa sta succedendo lì?
Utilizzo di Python 2.7.2, OS X, NumPy 1.6.1.
UPDATE:
Dopo debugging, ho braccati la causa di un percorso di codice che utilizzava un (piccolo fetta di) questo array NumPy mappato in memoria come input per una chiamata Pool.imap
.
Apparentemente il "problema" riguarda il modo in cui multiprocessing.Pool.imap
passa il suo input ai nuovi processi: utilizza pickle. Questo non funziona con gli array numpy e mmap
e qualcosa all'interno di interruzioni che porta all'errore.
Ho trovato this reply di Robert Kern che sembra affrontare lo stesso problema. Suggerisce di creare un percorso di codice speciale per quando l'input imap
proviene da un array mappato in memoria: la mappatura della memoria viene eseguita manualmente nel processo generato.
Questo sarebbe così complicato e brutto che preferirei vivere con l'errore e le copie di memoria extra. C'è un altro modo che sarebbe più leggero sulla modifica del codice esistente?
Joe le tue risposte sempre rock. Ho appena provato a immaginare qualcosa di simile. – YXD
Grazie per il suggerimento HDF. Sembra un grande cambiamento ma potrebbe valerne la pena, lo controllerò. – user124114