Memoria compartida en multiprocesamiento.

Tengo tres listas grandes. Primero contiene bitarrays (módulo bitarray 0.8.0) y los otros dos contienen matrices de enteros.

l1=[bitarray 1, bitarray 2, ... ,bitarray n]
l2=[array 1, array 2, ... , array n]
l3=[array 1, array 2, ... , array n]

Estas estructuras de datos requieren bastante RAM (~ 16 GB en total).

Si comienzo 12 subprocesos usando:

multiprocessing.Process(target=someFunction, args=(l1,l2,l3))

¿Esto significa que se copiarán l1, l2 y l3 para cada subproceso o los subprocesos compartirán estas listas? O para ser más directo, ¿usaré 16GB o 192GB de RAM?

someFunction leerá algunos valores de estas listas y luego realizará algunos cálculos basados ​​en los valores leídos. Los resultados serán devueltos al proceso padre. Las listas l1, l2 y l3 no serán modificadas por alguna función.

Por lo tanto, asumo que los subprocesos no necesitan y no copiarían estas enormes listas, sino que simplemente los compartirían con los padres. ¿Significa que el programa tomaría 16 GB de RAM (independientemente de cuántos subprocesos inicie) debido al enfoque de copia en escritura en Linux? ¿Estoy en lo correcto o me falta algo que pueda hacer que se copien las listas?

EDITAR: Todavía estoy confundido, después de leer un poco más sobre el tema. Por un lado, Linux utiliza copia en escritura, lo que debería significar que no se copian datos. Por otro lado, el acceso al objeto cambiará su recuento de referencia (todavía no estoy seguro de por qué y qué significa eso). Aun así, ¿se copiará todo el objeto?

Por ejemplo, si defino algunas funciones de la siguiente manera:

def someFunction(list1, list2, list3):
    i=random.randint(0,99999)
    print list1[i], list2[i], list3[i]

¿El uso de esta función significaría que l1, l2 y l3 se copiarán completamente para cada subproceso?

¿Hay una manera de comprobar esto?

EDIT2 Después de leer un poco más y monitorear el uso total de la memoria del sistema mientras se ejecutan los subprocesos, parece que se copian objetos completos para cada subproceso. Y parece que es porque la cuenta de referencia.

El recuento de referencias para l1, l2 y l3 no es necesario en mi programa. Esto se debe a que l1, l2 y l3 se mantendrán en la memoria (sin cambios) hasta que finalice el proceso principal. No hay necesidad de liberar la memoria utilizada por estas listas hasta entonces. De hecho, estoy seguro de que el recuento de referencia permanecerá por encima de 0 (para estas listas y todos los objetos en estas listas) hasta que el programa salga.

Entonces, ahora la pregunta es: ¿cómo puedo asegurarme de que los objetos no se copiarán en cada subproceso? ¿Quizás puedo deshabilitar el conteo de referencias para estas listas y cada objeto en estas listas?

EDITAR3 Sólo una nota adicional. Los subprocesos no necesitan modificarsel1, l2 yl3 o cualquier objeto en estas listas. Los subprocesos solo necesitan poder hacer referencia a algunos de estos objetos sin hacer que la memoria se copie para cada subproceso.

Respuestas a la pregunta(3)

Su respuesta a la pregunta