Obiekty z pamięcią współdzieloną w wieloprocesorowości

Załóżmy, że mam dużą tablicę numpy pamięci, mam funkcjęfunc która pobiera tę gigantyczną tablicę jako dane wejściowe (wraz z innymi parametrami).func z różnymi parametrami można uruchomić równolegle. Na przykład:

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]

Jeśli korzystam z biblioteki wieloprocesowej, wówczas ta wielka tablica będzie wielokrotnie kopiowana do różnych procesów.

Czy istnieje sposób, aby umożliwić innym procesom współużytkowanie tej samej tablicy? Ten obiekt tablicy jest tylko do odczytu i nigdy nie zostanie zmodyfikowany.

Co jest bardziej skomplikowane, jeśli arr nie jest tablicą, ale arbitralnym obiektem pythona, czy istnieje sposób na jej udostępnienie?

[EDITED]

Przeczytałem odpowiedź, ale wciąż jestem trochę zdezorientowany. Ponieważ fork () jest kopiowany podczas zapisu, nie powinniśmy wywoływać żadnych dodatkowych kosztów podczas tworzenia nowych procesów w bibliotece wieloprocesorowej Pythona. Ale poniższy kod sugeruje, że istnieje ogromny narzut:

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;

wyjście (a tak na marginesie, koszt wzrasta wraz ze wzrostem rozmiaru tablicy, więc podejrzewam, że nadal istnieje obciążenie związane z kopiowaniem pamięci):

construct array =  0.0178790092468
multiprocessing overhead =  0.252444982529

Dlaczego jest taki ogromny koszt, jeśli nie skopiujemy tablicy? A jaka część pamięci dzielonej mnie oszczędza?

questionAnswers(3)

yourAnswerToTheQuestion