2012-06-15 13 views
6

Quando carico il file in json, i picchi di utilizzo della memoria dei pitoni a circa 1,8 GB e non riesco a ottenere quella memoria da rilasciare. Ho messo insieme un banco di prova che è molto semplice:Utilizzo di memoria enorme del modulo json di Python?

with open("test_file.json", 'r') as f: 
    j = json.load(f) 

Mi dispiace che non posso fornire un file JSON di esempio, il mio file di prova ha un sacco di informazioni sensibili, ma per il contesto, ho a che fare con un file nell'ordine di 240 MB. Dopo aver eseguito le 2 righe precedenti, ho in uso il precedente 1.8GB di memoria. Se faccio allora l'utilizzo della memoria del j non cade affatto. Se lo seguo con un gc.collect() ancora non si rilascia. Ho anche provato a scaricare il modulo json ed eseguire un altro gc.collect.

Sto provando a eseguire un po 'di profilazione della memoria, ma ora ho accumulato una CPU al 100% per circa un'ora e non ha ancora prodotto alcun output.

Qualcuno ha qualche idea? Ho anche provato quanto sopra usando cjson piuttosto che il modulo json impacchettato. cjson usava circa il 30% di memoria in meno ma in caso contrario mostrava esattamente gli stessi problemi.

Sto eseguendo Python 2.7.2 su server Ubuntu 11.10.

Sono felice di caricare qualsiasi profiler di memoria e vedere se funziona meglio di heapy e fornire qualsiasi diagnostica che si possa ritenere necessaria. Sto cercando un grosso file json di prova che posso fornire a chiunque altro per provarlo.

+0

Si prega di provare con un altro file. Stai eseguendo una sessione interattiva o un file di script Python? Entrambi mostrano lo stesso problema? – heltonbiker

+0

Correlati: http://stackoverflow.com/questions/2400643/is-there-a-memory-efficient-and-fast-way-to-load-big-json-files-in-python – ChristopheD

+0

@ChristopheD Il mio problema è con la memoria che non viene mai rilasciata. Non mi interessa tanto che viene utilizzata molta memoria durante l'analisi. – Endophage

risposta

13

Credo che questi due link affrontare alcuni punti interessanti su questo non necessariamente essere un problema di JSON, ma solo un problema di "large object" e come la memoria funziona con python vs il sistema operativo

Vedi Why doesn't Python release the memory when I delete a large object? del motivo per cui la memoria rilasciato in pitone non si riflette necessariamente dal sistema operativo:

Se si crea un oggetto di grandi dimensioni ed elimina di nuovo, Python ha probabilmente rilasciato la memoria, ma le allocatori memoria interessate non necessariamente riportare la memoria alla sistema operativo, quindi potrebbe sembrare che il processo Python usi molta più memoria virtuale di quella in realtà utilizza.

Chi running large object processes in a subprocess di lasciare che l'accordo operativo con la bonifica:

L'unico modo veramente affidabile per garantire che una grande ma temporaneo uso della memoria fa ritorno tutte le risorse al sistema quando è fatto, è per fare in modo che l'uso avvenga in un sottoprocesso, che poi termina il lavoro affamato di memoria. In tali condizioni, il sistema operativo eseguirà il proprio lavoro e riciclerà volentieri tutte le risorse che il sottoprocesso potrebbe aver inghiottito. Fortunatamente, il modulo multiprocessing rende questo tipo di operazione (che era piuttosto un dolore) non troppo male nelle versioni moderne di Python.

+1

Assicurati di includere estratti/esempi rilevanti per contrastare la natura non stabile del dato su internet :) –

+0

@pst: Grazie! Apprezzo che tu l'abbia aggiunto. – jdi

+0

Molto frustrante. Sembra che il tuo primo frammento descriva accuratamente la situazione. – Endophage

Problemi correlati