У меня есть массив 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
-list: мой CPU мало что делает, но память и своп полностью поглощаются за считанные секунды, что явно не так Я хочу.
Есть ли способ передать этот огромный список функции многопроцессорности без необходимости явно создавать ее? Или вы знаете другой способ решения этой проблемы?
Спасибо!: -)