Estoy usando el módulo multiprocessing
de Python para procesar grandes matrices numpy en paralelo. Las matrices se mapean en memoria utilizando numpy.load(mmap_mode='r')
en el proceso maestro. Después de eso, multiprocessing.Pool()
bifurca el proceso (supongo).NumPy vs. multiprocesamiento y mmap
Todo parece funcionar bien, excepto que estoy recibiendo líneas como:
AttributeError ("objeto 'NoneType' no tiene atributo 'decirle'",) en
<bound method memmap.__del__ of memmap([ 0.57735026, 0.57735026, 0.57735026, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], dtype=float32)>
ignorado
en el Registros de prueba de unidad. Las pruebas pasan bien, sin embargo.
¿Alguna idea de lo que está pasando allí?
Usando Python 2.7.2, OS X, NumPy 1.6.1.
UPDATE:
Después de algún depuración, I perseguidos la causa a una ruta de código que se utiliza una (pequeña parte de) esta matriz numpy asignado en memoria como entrada a una llamada Pool.imap
.
Aparentemente, el "problema" es con la forma en que multiprocessing.Pool.imap
pasa su entrada a los nuevos procesos: usa pickle. Esto no funciona con mmap
ed numpy arrays, y algo dentro de los saltos que conduce al error.
Encontré this reply de Robert Kern, que parece abordar el mismo problema. Sugiere crear una ruta de código especial para cuando la entrada imap
proviene de una matriz mapeada en memoria: mapeo de memoria la misma matriz manualmente en el proceso engendrado.
Esto sería tan complicado y feo que preferiría vivir con el error y las copias de memoria adicionales. ¿Hay alguna otra manera que sería más ligero en la modificación del código existente?
Joe sus respuestas siempre rockean. Solo he estado tratando de descubrir algo como esto. – YXD
Gracias por la punta HDF. Parece un gran cambio pero puede valer la pena, lo verificaré. – user124114