Объекты с общей памятью в многопроцессорной обработке

Предположим, у меня есть большой в памяти массив 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;

output (и, кстати, стоимость увеличивается с увеличением размера массива, поэтому я подозреваю, что все еще есть накладные расходы, связанные с копированием памяти):

construct array =  0.0178790092468
multiprocessing overhead =  0.252444982529

Почему есть такие огромные накладные расходы, если мы не скопировали массив? И какую часть общей памяти спасает меня?

111
задан martineau 11 August 2017 в 14:58
поделиться