Supongamos que tengo una gran matriz numpy en memoria, tengo una función func
que toma esta matriz gigante como entrada (junto con algunos otros parámetros). func
con diferentes parámetros se pueden ejecutar en paralelo. Por ejemplo:
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]
Si uso la biblioteca de multiprocesamiento, esa matriz gigante se copiará varias veces en diferentes procesos.
¿Hay alguna manera de permitir que diferentes procesos compartan la misma matriz? Este objeto de matriz es de solo lectura y nunca se modificará.
Lo que es más complicado, si arr no es una matriz, sino un objeto python arbitrario, ¿hay alguna manera de compartirlo?
[EDITADO]
Leí la respuesta pero todavía estoy un poco confundido. Dado que fork () es copia en escritura, no deberíamos invocar ningún costo adicional al generar nuevos procesos en la biblioteca de multiprocesamiento de python. Pero el siguiente código sugiere que hay una gran sobrecarga:
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;
salida (y, por cierto, el costo aumenta a medida que aumenta el tamaño de la matriz, por lo que sospecho que todavía hay gastos generales relacionados con la copia de memoria):
construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529
¿Por qué hay una sobrecarga tan grande si no copiamos la matriz? ¿Y qué parte me salva la memoria compartida?