Supponiamo di avere un grande array numpy in memoria, ho una funzione func
che accetta questo array gigante come input (insieme ad alcuni altri parametri). func
con diversi parametri possono essere eseguiti in parallelo. Per esempio:
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]
Se utilizzo la libreria multiprocessing, quell'array gigante verrà copiato più volte in processi diversi.
C'è un modo per consentire a processi diversi di condividere lo stesso array? Questo oggetto array è di sola lettura e non verrà mai modificato.
Cosa c'è di più complicato, se arr non è un array, ma un oggetto Python arbitrario, c'è un modo per condividerlo?
[MODIFICATO]
Ho letto la risposta ma sono ancora un po 'confuso. Poiché fork () è copy-on-write, non dovremmo invocare alcun costo aggiuntivo quando si generano nuovi processi nella libreria multiprocessing python. Ma il codice seguente suggerisce che c'è un enorme sovraccarico:
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 (e, a proposito, il costo aumenta con l'aumentare della dimensione dell'array, quindi sospetto che ci sia ancora un sovraccarico relativo alla copia della memoria):
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
Perché c'è un sovraccarico così enorme, se non abbiamo copiato l'array? E quale parte mi salva la memoria condivisa?