Sto elaborando grandi quantità di dati, memorizzati in un dizionario, utilizzando il multiprocessing. Fondamentalmente tutto ciò che sto facendo è caricare alcune firme, memorizzato in un dizionario, costruirci un oggetto dict condiviso (ottenendo l'oggetto 'proxy' restituito da Manager.dict()) e passare questo proxy come argomento alla funzione che ha da eseguire in multiprocessing.python: condivisione di enormi dizionari utilizzando il multiprocessing
Giusto per chiarire:
signatures = dict()
load_signatures(signatures)
[...]
manager = Manager()
signaturesProxy = manager.dict(signatures)
[...]
result = pool.map (myfunction , [ signaturesProxy ]*NUM_CORES)
Ora, tutto funziona perfettamente se firme è inferiore a 2 milioni di voci o giù di lì. Ad ogni modo, devo elaborare un dizionario con i tasti 5.8M (decapaggio firme in formato binario genera un file da 4,8 GB). In questo caso, il processo muore durante la creazione dell'oggetto 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
---------------------------------------------------------------------------
so la struttura dei dati è enorme, ma sto lavorando su una macchina dotata w/32GB di RAM, e in esecuzione in alto vedo che il processo, dopo aver caricato le firme, occupa 7 GB di RAM. Quindi inizia a costruire l'oggetto proxy e l'utilizzo della RAM sale a circa 17 GB di RAM, ma non si avvicina mai a 32. A questo punto, l'utilizzo della RAM inizia a diminuire rapidamente e il processo termina con l'errore precedente. Quindi immagino che questo non sia dovuto a un errore di memoria esaurita ...
Qualche idea o suggerimento?
Grazie,
Davide
Funziona con Windows 7 (che è sicuramente un sistema operativo moderno?) –
@Seun: non lo so; prova a provarlo Dubito che il suo modello di processo sia più moderno delle versioni precedenti; Windows è sempre stato nei periodi bui a tale proposito. –
(Niente come SO per i downvotes casuali, errati.) –