Tengo una matriz Numpy 256x256x256
, en la que cada elemento es una matriz. Necesito hacer algunos cálculos en cada una de estas matrices, y quiero usar el módulo multiprocessing
para acelerar las cosas.¿Combinar itertools y multiprocesamiento?
Los resultados de estos cálculos se deben almacenar en una matriz de 256x256x256
como el original, por lo que el resultado de la matriz en el elemento [i,j,k]
en la matriz original se debe poner en el elemento de [i,j,k]
de la nueva matriz.
Para hacer esto, quiero hacer una lista que podría escribirse en una forma pseudo-ish como [array[i,j,k], (i, j, k)]
y pasarla a una función para ser "multiprocesado". Suponiendo que matrices
es una lista de todas las matrices extraídos de la matriz original y myfunc
es la función de hacer los cálculos, el código sería algo como esto:
import multiprocessing
import numpy as np
from itertools import izip
def myfunc(finput):
# Do some calculations...
...
# ... and return the result and the index:
return (result, finput[1])
# Make indices:
inds = np.rollaxis(np.indices((256, 256, 256)), 0, 4).reshape(-1, 3)
# Make function input from the matrices and the indices:
finput = izip(matrices, inds)
pool = multiprocessing.Pool()
async_results = np.asarray(pool.map_async(myfunc, finput).get(999999))
Sin embargo, parece que map_async
es en realidad la creación de este enorme finput
-list primero: Mi CPU no está haciendo mucho, pero la memoria y el intercambio se consumen por completo en cuestión de segundos, lo que obviamente no es lo que quiero.
¿Hay alguna manera de pasar esta enorme lista a una función de multiprocesamiento sin la necesidad de crearla explícitamente primero? ¿O conoce otra forma de resolver este problema?
¡Muchas gracias! :-)
Dado que está utilizando 'get()' en 'map_async()', probablemente no desee una operación * asincrónica * y debería usar 'Pool.map()' en su lugar. –
Quizás no entiendo el problema correctamente, pero ¿ha considerado imap o imap_unordered? –