web-dev-qa-db-fra.com

Libération de la mémoire d'un énorme tableau numpy dans IPython

MISE À JOUR: - Ce problème s'est résolu après un redémarrage de la machine. Pas encore en mesure de comprendre pourquoi cette erreur se produisait auparavant.

J'ai une fonction qui charge un énorme tableau numpy (~ 980 Mo) et le renvoie.

Lorsque je démarre Ipython pour la première fois et que j'appelle cette fonction, il charge le tableau dans la variable sans aucun problème.

Mais si j'exécute à nouveau la même commande, elle se termine en soulevant une "erreur de mémoire".

J'ai essayé ce qui suit,

del hugeArray

Toujours la même erreur se produisait. J'ai même essayé ce qui suit

del hugeArray
gc.collect()
gc.collect()

Initialement, gc.collect() a renvoyé 145 et le deuxième appel a renvoyé 48. Mais même après cela, lorsque j'appelle la fonction, il soulevait toujours une erreur de mémoire.

La seule façon de charger à nouveau était de redémarrer ipython. Y a-t-il quelque chose que je peux faire pour libérer toute la mémoire dans ipython, de sorte que je n'ai pas à le redémarrer?

----------------Mise à jour

Voici la sortie de %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'>

En dehors de cela, gr est mon module contenant la fonction que j'ai utilisée pour charger le cube de données.

--------- Comment reproduire l'erreur

La fonction simple suivante est capable de reproduire l'erreur.

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

Cette erreur se produit uniquement en Ipython. En simple python (>>>) après avoir donné del testcube, Il n'y a pas d'erreur de mémoire.

49
indiajoe

Cherchez-vous la valeur? IPython met en cache les variables de sortie comme par exemple Out[8], donc si vous l'examinez, il sera conservé en mémoire.

Tu peux faire %xdel testcube pour supprimer la variable et la supprimer du cache d'IPython. Alternativement, %reset out ou %reset array effacera tout votre historique de sortie, ou seulement les références aux tableaux numpy.

55
Thomas K