Предположим, у меня есть большой массив numpy в памяти, у меня есть функция, func
которая принимает этот гигантский массив в качестве входных данных (вместе с некоторыми другими параметрами). func
с разными параметрами можно запускать параллельно. Например:
def func(arr, param):
# do stuff to arr, param
# build array arr
pool = Pool(processes = 6)
results = [pool.apply_async(func, [arr, param]) for param in all_params]
output = [res.get() for res in results]
Если я использую многопроцессорную библиотеку, то этот гигантский массив будет многократно скопирован в разные процессы.
Есть ли способ разрешить различным процессам использовать один и тот же массив? Этот объект массива доступен только для чтения и никогда не будет изменен.
Что еще сложнее, если arr - это не массив, а произвольный объект Python, есть ли способ поделиться им?
[Изменено]
Я прочитал ответ, но все еще немного запутался. Поскольку fork () является копированием при записи, мы не должны вызывать каких-либо дополнительных затрат при создании новых процессов в библиотеке многопроцессорной обработки Python. Но следующий код предполагает огромные накладные расходы:
from multiprocessing import Pool, Manager
import numpy as np;
import time
def f(arr):
return len(arr)
t = time.time()
arr = np.arange(10000000)
print "construct array = ", time.time() - t;
pool = Pool(processes = 6)
t = time.time()
res = pool.apply_async(f, [arr,])
res.get()
print "multiprocessing overhead = ", time.time() - t;
вывод (и, кстати, стоимость увеличивается с увеличением размера массива, поэтому я подозреваю, что накладные расходы, связанные с копированием памяти, все еще существуют):
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
Почему возникают такие огромные накладные расходы, если мы не копировали массив? А какую часть меня спасает разделяемая память?