AGGIORNAMENTO: - Questo problema si risolveva da solo dopo il riavvio della macchina. Non ancora in grado di capire perché questo errore stava accadendo prima.Rilascio memoria di un enorme array numpy in IPython
Ho una funzione che carica un enorme array numpy (~ 980 MB) e lo restituisce.
Quando avvio Ipython per la prima volta e chiamo questa funzione, carica la matrice nella variabile senza alcun problema.
Ma se eseguo di nuovo lo stesso comando, esce sollevando un "Errore di memoria".
Ho provato quanto segue,
del hugeArray
ancora lo stesso errore si ebbero. Ho anche provato il seguente
del hugeArray
gc.collect()
gc.collect()
Inizialmente, gc.collect()
restituito 145 e la seconda chiamata restituito 48. Ma anche dopo questo quando chiamo la funzione, era ancora sollevando un errore di memoria.
L'unico modo per caricare nuovamente era il riavvio di ipython. C'è qualcosa che posso fare per liberare tutta la memoria in ipython, così che non devo riavviarlo?
---------------- Aggiornamento
seguito è l'output di %whos
Variable Type Data/Info
------------------------------
gc module <module 'gc' (built-in)>
gr module <module 'Generate4mRamp' <...>rom 'Generate4mRamp.pyc'>
np module <module 'numpy' from '/us<...>ages/numpy/__init__.pyc'>
plt module <module 'matplotlib.pyplo<...>s/matplotlib/pyplot.pyc'>
Di questi, gr è il mio modulo che contiene la funzione che ho usato per caricare il cubo di dati.
--------- Come riprodurre l'errore
Il seguente semplice funzione è in grado di riprodurre l'errore.
import numpy as np
import gc
def functionH():
cube=np.zeros((200,1024,1024))
return cube
testcube=functionH() #Runs without any issue
del testcube
testcube=functionH() # Raises Memory Error
del testcube
gc.collect()
gc.collect()
testcube=functionH() # Still Raises Memory Error
Questo errore si verifica solo in ipython. In semplice python (>>>) dopo aver dato del testcube
, non vi è alcun errore di memoria.
Puoi provare a chiamare 'whos' in ipython per scoprire cosa sta occupando la memoria? – tiago
@tiago: ho aggiunto l'output del comando% whos. Non mostra nient'altro che i moduli che ho caricato. – indiajoe
Puoi mostrare il numero di riferimento dell'oggetto prima di cancellarlo? 'import sys; sys.getrefcount (testcube)' – HYRY