J'ai quelques (presque dix) Go de mémoire pris par le noyau ipython. Je pense que cela provient d'objets volumineux (matrices, listes, tableaux numpy, ...) que j'ai peut-être produits au cours d'une opération et dont je n'ai plus besoin.
Je voudrais lister tous les objets que j'ai définis et les trier par leur empreinte mémoire. Y a-t-il un moyen simple de faire ça? Pour certains types, il existe une méthode nbytes
, mais pas pour tous ... Je recherche donc un moyen général de répertorier tous les objets que j'ai créés et leur occupation de la mémoire.
En supposant que vous utilisiez ipython
ou jupyter
, vous devrez effectuer un peu de travail pour obtenir une liste de tous les objets vous avez défini. Cela signifie prendre tout ce qui est disponible dans globals()
et filtrer les objets qui sont modules
, builtins
, ipython objects
, etc. Une fois que vous êtes sûr d’avoir ces objets, vous pouvez alors saisir leurs tailles avec sys.getsizeof
. Cela peut se résumer comme suit:
import sys
# These are the usual ipython objects, including this one you are creating
ipython_vars = ['In', 'Out', 'exit', 'quit', 'get_ipython', 'ipython_vars']
# Get a sorted list of the objects and their sizes
sorted([(x, sys.getsizeof(globals().get(x))) for x in dir() if not x.startswith('_') and x not in sys.modules and x not in ipython_vars], key=lambda x: x[1], reverse=True)
N'oubliez pas que pour les python (ceux créés avec les fonctions intégrées de python)), sys.getsizeof
sera très précis. Mais cela peut être un peu inexact sur les objets créés à l'aide de bibliothèques tierces. De plus, n'oubliez pas que sys.getsizeof
ajoute une surcharge supplémentaire du ramasse-miettes si l'objet est géré par le ramasse-miettes. Ainsi, certaines choses peuvent paraître un peu plus lourdes qu'elles ne le sont réellement.
En note, numpy
's .nbytes
La méthode peut être quelque peu trompeuse car elle n'inclut pas la mémoire consommée par des attributs autres que des éléments de l'objet tableau.
J'espère que ça aide.