Сочетание Itertools и Multipressing?

У меня есть 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 первым: мой процессор не делает много, но память и обмен полностью потребляются в течение нескольких секунд, что, очевидно, Не то, что я хочу.

Есть ли способ передать этот огромный список в функцию многопроцессорной функции без необходимости явного создания этого сначала? Или вы знаете еще один способ решения этой проблемы?

Спасибо кучу! : -)

12
задан digitaldingo 5 September 2011 в 10:05
поделиться