Припустимо, у мене є великий масив масивної пам'яті, у мене є функція, 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
Чому виникають такі величезні накладні витрати, якщо ми не копіювали масив? І яка частина мене врятує загальна пам'ять?