Estoy procesando grandes cantidades de datos, almacenados en un diccionario, mediante multiprocesamiento. Básicamente, todo lo que hago es cargar algunas firmas, almacenarlas en un diccionario, crear un objeto dict compartido (obtener el objeto 'proxy' devuelto por Manager.dict()) y pasar este proxy como argumento a la función que tiene para ser ejecutado en multiprocesamiento.python: compartir diccionarios de gran tamaño con multiprocesamiento
Solo para aclarar:
signatures = dict()
load_signatures(signatures)
[...]
manager = Manager()
signaturesProxy = manager.dict(signatures)
[...]
result = pool.map (myfunction , [ signaturesProxy ]*NUM_CORES)
Ahora, si todo funciona perfectamente firmas es inferior a 2 millones de entradas o menos. De todos modos, tengo que procesar un diccionario con 5.8M claves (decapado firmas en formato binario genera un archivo de 4.8 GB). En este caso, el proceso muere durante la creación del objeto proxy:
Traceback (most recent call last):
File "matrix.py", line 617, in <module>
signaturesProxy = manager.dict(signatures)
File "/usr/lib/python2.6/multiprocessing/managers.py", line 634, in temp
token, exp = self._create(typeid, *args, **kwds)
File "/usr/lib/python2.6/multiprocessing/managers.py", line 534, in _create
id, exposed = dispatch(conn, None, 'create', (typeid,)+args, kwds)
File "/usr/lib/python2.6/multiprocessing/managers.py", line 79, in dispatch
raise convert_to_error(kind, result)
multiprocessing.managers.RemoteError:
---------------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python2.6/multiprocessing/managers.py", line 173, in handle_request
request = c.recv()
EOFError
---------------------------------------------------------------------------
sé la estructura de datos es enorme, pero estoy trabajando en una máquina equipada w/32 GB de RAM, y corriendo arriba veo que el proceso, después de cargar las firmas, ocupa 7 GB de RAM. A continuación, comienza a construir el objeto proxy y el uso de la memoria RAM sube a ~ 17GB de RAM, pero nunca se acerca a 32. En este punto, el uso de RAM comienza a disminuir rápidamente y el proceso termina con el error anterior. Así que supongo que esto no se debe a un error de falta de memoria ...
¿Alguna idea o sugerencia?
Gracias,
Davide
¿Funciona esto con Windows 7 (que definitivamente es un sistema operativo moderno?) –
@Seun: No lo sé; prueba probarlo Dudo que su modelo de proceso sea más moderno que las versiones anteriores; Windows siempre ha estado en la edad oscura sobre eso. –
(No hay nada como SO para votos indirectos aleatorios e incorrectos) –