Я пытаюсь заполнить большой массив numpy, используя многопроцессорность. Я проработал параллельные примеры фьючерсов в документации, но не получил достаточного понимания, чтобы изменить использование.
Вот упрощенная версия того, что я хотел бы сделать:
import numpy
import concurrent.futures
squares = numpy.empty((20, 2))
def make_square(i, squares):
print('iteration', i)
squares[i, 0], squares[i, 1] = i, i ** 2
with concurrent.futures.ProcessPoolExecutor(2) as executor:
for i in range(20):
executor.submit(make_square, i, squares)
Результат выглядит примерно так:
iteration 1
iteration 0
iteration 2
iteration 3
iteration 5
iteration 4
iteration 6
iteration 7
iteration 8
iteration 9
iteration 10
iteration 11
iteration 12
iteration 13
iteration 15
iteration 14
iteration 16
iteration 17
iteration 18
iteration 19
что наглядно демонстрирует, что функция выполняется одновременно. Но массив квадратов все еще пуст.
Каков правильный синтаксис для заполнения массива квадратов?
Во-вторых, будет ли использование .map лучшей реализацией?
Заранее спасибо!
02.08.17 Вау. Так что я забрел на Reddit-Land, потому что не собирался брать людей для решения этой проблемы. Так счастлив вернуться сюда, на stackoverflow. Спасибо @ilia w495 nikitin и @donkopotamus. Вот что я опубликовал в Reddit, в котором более подробно объясняется предыстория этой проблемы.
The posted code is an analogy of what I'm trying to do, which is populating
a numpy array with a relatively simple calculation (dot product) involving
two other arrays. The algorithm depends on a value N which can be anything
from 1 on up, though we won't likely use a value larger than 24.
I'm currently running the algorithm on a distributed computing system and
the N = 20 versions take longer than 10 days to complete. I'm using dozens
of cores to obtain the required memory, but gaining none of the benefits of
multiple CPUs. I've rewritten the code using numba which makes lower N
variants superfast on my own laptop which can't handle the memory
requirements for larger Ns, but alas, our distributed computing environment
is not currently able to install numba. So I'm attempting concurrent.futures
to take advantage of the multiple CPUs in our computing environment in the
hopes of speeding things up.
Так что времени требуют не вычисления, а более 16 миллионов итераций. Инициализированный массив равен N x 2 ** N, то есть диапазон (16777216) в приведенном выше коде.
Может быть, просто невозможно заполнить массив посредством многопроцессорной обработки.
C
части, гдеC
- количество процессоров, и обрабатывать каждую часть на отдельном процессоре (процессе). Затем соедините все части, и вы получите то, что хотите. Но в некоторых случаях это неприменимо. Это зависит от вашего алгоритма. Кроме того, за отправку данных между процессами взимается отдельная плата. Например, я попробую реализовать с помощьюpymp
: gist.github.com/w495/6d3cd6a715e3098a Сconcurrent.futures
будет проще. - person Ilia w495 Nikitin   schedule 03.08.2016concurrent.futures.ProcessPoolExecutor
: gist.github.com / w495 / 82f7b21509a69a0d70e18f2e4ddf5ed9 Я полагаю, это тоже может вам помочь. - person Ilia w495 Nikitin   schedule 04.08.2016