Я ищу, чтобы заполнить большой массив numpy, используя многопроцессорность. Я работал над параллельными примерами фьючерсов в документации, но не получил достаточного понимания для изменения использования.заполнить массив numpy через concurrent.futures multiprocessing
Вот упрощенная версия того, что я хотел бы сделать:
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 лучше реализовать?
Заранее благодарен!
8/2/17 Ничего себе. Поэтому я бродил по красно-коричневому краю, потому что я не получал никаких решений для этой проблемы. Так счастлив вернуться сюда в stackoverflow. Спасибо @ilia w495 никитин и @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) в приведенном выше коде.
Возможно, просто невозможно заполнить массив посредством многопроцессорной обработки.
массива Ваших квадратиков пуст, потому что вы пытаетесь изменить его в отдельном ** процессы ** – donkopotamus
@zazizoma Не заполнять, а инициализировать. Есть еще парадигма. общие структуры данных должны быть неизменными. Думаю, вам следует разделить ваш массив на части 'C', где' C' - количество процессоров и обрабатывать каждую часть на отдельном CPU (процессе). Затем присоединяйтесь ко всем частям, и вы получите то, что хотите. Но в некоторых случаях это неприменимо. Это зависит от вашего алгоритма. Кроме того, передача данных между процессами имеет свою собственную стоимость. Например, я буду стараться реализовать с помощью 'pymp': https://gist.github.com/w495/6d3cd6a715e3098a3a10a0479d9fbb03 С' concurrent.futures' это будет проще. –
Отлично. Я также посмотрю, как запустить dot-продукт в нескольких процессорах и оставить итерации линейными. Это может помочь. ДЕЙСТВИТЕЛЬНО оцените руководство. – zazizoma