web-dev-qa-db-fra.com

Python: Ctypes comment vérifier la gestion de la mémoire

J'utilise donc Python comme interface graphique frontale qui interagit avec certains fichiers C pour le stockage et la gestion de la mémoire en tant que backend. Chaque fois que la fenêtre de l'interface graphique est fermée ou quittée, j'appelle toutes les méthodes de destruction pour mes variables allouées.

Est-il possible de vérifier les fuites de mémoire ou la disponibilité, comme une vérification C Valgrind, juste avant de quitter tout le programme pour s'assurer qu'il n'y a pas de fuites de mémoire?

Exemple de sortie:

from tkinter import *
root = Tk()  # New GUI
# some code here

def destructorMethods:
    myFunctions.destructorLinkedList()  # Destructor method of my allocated memory in my C file
    # Here is where I would want to run a Valgrind/Memory management check before closing
    root.destroy()  # close the program

root.protocol("WM_DELETE_WINDOW", destructorMethods)  # When the close window option is pressed call destructorMethods function

9
notMyName

Si vous voulez utiliser Valgrind, alors ceci readme peut être utile. Probablement, this pourrait être une autre bonne ressource pour rendre Valgrind convivial python et l'utiliser dans votre programme.

Mais si vous considérez quelque chose d'autre comme tracemalloc, alors vous pouvez facilement en obtenir un exemple d'utilisation ici . Les exemples sont assez faciles à interpréter. Par exemple selon leur doc,

  import tracemalloc
  tracemalloc.start()

  # ... run your application ...
  snapshot = tracemalloc.take_snapshot()
  top_stats = snapshot.statistics('lineno')
  print("[ Top 10 ]")
  for stat in top_stats[:10]:
  print(stat)

Cela produira quelque chose comme.

 <frozen importlib._bootstrap>:716: size=4855 KiB, count=39328, average=126 B
 <frozen importlib._bootstrap>:284: size=521 KiB, count=3199, average=167 > 

Vous pouvez soit analyser cela pour tracer l'utilisation de la mémoire pour votre enquête, soit utiliser la référence doc pour avoir une idée plus concrète.

Dans ce cas, votre programme peut ressembler à ceci:

 from tkinter import *
 import tracemalloc
 root = Tk()  # New GUI
 # some code here

 def destructorMethods:
     tracemalloc.start()
     myFunctions.destructorLinkedList()  # Destructor method of my allocated memory in my C file
     # Here is where I would want to run a Valgrind/Memory management check before closing
     snapshot = tracemalloc.take_snapshot()
     top_stats = snapshot.statistics('lineno')
     print("[ Top 10 ]")
     for stat in top_stats[:10]:
         print(stat)
     
     root.destroy()  # close the program

 root.protocol("WM_DELETE_WINDOW", destructorMethods)  

Une autre option est, vous pouvez utiliser un profileur de mémoire pour voir l'utilisation de la mémoire à un moment variable. Le package est disponible ici . Après l'installation de ce package, vous pouvez probablement utiliser la commande suivante dans votre script pour obtenir l'utilisation de la mémoire au fil du temps dans un fichier png.

 mprof run --include-children python your_filename.py
 mprof plot --output timelyplot.png

ou vous pouvez utiliser différentes fonctions disponibles sur memory_profiler package selon vos besoins. Peut-être que this tutoriel peut être intéressant pour vous.

2
moyeen52

Pour trace python fuites de mémoire jetez un œil à cet article et - pour plus de détails - à ces questions, ici sur SO:

1
andreagalle

Je pense que vous pouvez utiliser un allocateur de mémoire de débogage, qui prend en charge la détection des fuites.

Quelque chose comme tcmalloc ferait l'affaire. Vous venez de LD_PRELOAD et tous vos appels à malloc, free etc. débogueront pour les fuites.

0
rostamn739