Il est nécessaire de remettre la procédure de travail d'une simple enquête sur une fuite de mémoire et de la demander, je l'ai donc résumée ici également
J'ai utilisé guppy et heapy, mais tracemalloc est standard dans la série 3.4, et je peux faire la différence entre les instantanés, donc je pense que c'est correct de choisir celui-ci à l'avenir.
Installez et utilisez le module pytracemalloc jusqu'à la série 3.3
import tracemalloc
tracemalloc.start()
# ... run your application ...
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
Le nombre et la taille des blocs alloués sont affichés pour chaque ligne pour laquelle la mémoire est allouée par malloc
Cela suffit pour comprendre le problème
import tracemalloc
tracemalloc.start()
# ... start your application ...
snapshot1 = tracemalloc.take_snapshot()
# ... call the function leaking memory ...
snapshot2 = tracemalloc.take_snapshot()
top_stats = snapshot2.compare_to(snapshot1, 'lineno')
print("[ Top 10 differences ]")
for stat in top_stats[:10]:
print(stat)
Étant donné que la différence entre le nombre de blocs et la taille de chaque ligne où malloc a couru est affichée, la mémoire qui n'est pas libérée même si la fonction est exécutée apparaît comme la différence.
Recommended Posts