Objetos de memoria compartida en multiprocesamiento.

Supongamos que tengo un gran número en la matriz de memoria, tengo una funciónfunc eso toma en 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, entonces esa matriz gigante se copiará varias veces en diferentes procesos.

¿Hay una 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 de python arbitrario, ¿hay alguna forma de compartirlo?

[Editado]

Leí la respuesta pero todavía estoy un poco confundido. Como 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?

Respuestas a la pregunta(3)

Su respuesta a la pregunta