У меня есть 256x256x256
Numpy Marage, в котором каждый элемент является матрицей. Мне нужно сделать некоторые расчеты на каждом из этих матриц, и я хочу использовать многопроцессорную модуль
, чтобы ускорить вещи.
Результаты этих расчетов должны храниться в массиве 256x256x256
, как оригинальный, так что результат матрицы на элементе [I, J, K]
в Оригинальный массив должен быть введен в элемент [I, J, K]
нового массива.
Чтобы сделать это, я хочу сделать список, который может быть написан в псевдо-ише, как [Array [I, J, K], (i, j, k)]
и пропуск Это к функции быть «многопроцессорной».
Предполагая, что матрицы
- это список всех матриц, извлеченных из исходного массива и MyFunc
- это функция, выполняющая расчеты, код будет выглядеть несколько так:
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))
Однако это Похоже, Map_Async
на самом деле создает этот огромный Finept
-List первым: мой процессор не делает много, но память и обмен полностью потребляются в течение нескольких секунд, что, очевидно, Не то, что я хочу.
Есть ли способ передать этот огромный список в функцию многопроцессорной функции без необходимости явного создания этого сначала? Или вы знаете еще один способ решения этой проблемы?
Спасибо кучу! : -)