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?