У меня есть 256x256x256
массив Numpy, в котором каждый элемент является матрицей. Мне нужно сделать некоторые вычисления для каждой из этих матриц, и я хочу использовать модуль multiprocessing
, чтобы ускорить процесс.
Результаты этих вычислений должны быть сохранены в массиве 256x256x256
, как и исходный, так что результат матрицы в элементе [i,j,k]
в исходном массиве должен быть помещен в элемент [i,j,k]
нового массив.
Для этого я хочу создать список, который можно записать псевдоизображением как [array[i,j,k], (i, j, k)]
, и передать его функции, которая будет «мультипроцессорной».
Предполагая, что matrices
- это список всех матриц, извлеченных из исходного массива, а 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
на самом деле сначала создает этот огромный finput
-лист: мои ЦП не слишком много работают, но память и подкачка полностью расходуются в считанные секунды, что, очевидно, не то, что Я хочу.
Есть ли способ передать этот огромный список многопроцессорной функции без необходимости его явного предварительного создания?
Или вы знаете другой способ решения этой проблемы?
Спасибо большое! : -)