9
votes

Comment puis-je profiler la mémoire du programme multithread en Python?

Y a-t-il un moyen de profiler la mémoire d'un programme multithread en Python?

Pour le profilage de la CPU, j'utilise le CProfile pour créer des statistiques de profilé séparées pour chaque thread et les combiner ultérieurement. Cependant, je n'ai pas pu trouver un moyen de le faire avec des profileurs de mémoire. J'utilise un tas.

Y a-t-il un moyen de combiner des statistiques dans un tas comme le CProfile? Ou quels autres profileurs de mémoire suggéreriez-vous que cela convient mieux à cette tâche?

Une question connexe a été invitée à profiler Utilisation de la CPU sur le programme multi-thread: Comment puis-je profiler un programme multithread en Python?

Aussi une autre question concernant la mémoire profileur: Profileur de mémoire Python


4 commentaires

Qu'est-ce que vous n'aimez pas sur les solutions dans ces autres questions?


@Falmarri, je cherche un profileur "mémoire". Le premier est principalement un profileur de la CPU. Le second fonctionne uniquement pour un seul fil.


La principale caractéristique des threads est qu'ils partagent la mémoire (contrairement aux processus). Comment vous attendez-vous à profiler différentes statistiques de mémoire pour les threads partageant la même mémoire?


@scoffey Heypy, le profileur de mémoire, ne profile pas tous les fils comme un. Il propose uniquement l'utilisation de la mémoire du fil à laquelle il fonctionne. Je cherche un moyen de profiler la mémoire de l'ensemble du processus. La même idée va pour le profileur CPU, le module CProfile. Cependant, il existe un moyen de combiner les statistiques de profil de différents threads avec CProfile qui s'explique dans le lien que j'ai donné ci-dessus.


4 Réponses :


3
votes

Il existe des moyens d'obtenir Valgrind pour profiler la mémoire des programmes Python: http://www.python.org/dev/faq/#can--run-valgrind-against-python


2 commentaires

Jamais entendu parler de Valgrind avant; va certainement vérifier.


@funktku Il s'agit d'un outil standard pour le profilage de la mémoire et la détection de fuites de mémoire.



1
votes

OK. Ce que je cherchais exactement ne semble pas exister. J'ai donc trouvé une solution - une solution de contournement pour ce problème.

au lieu de la mémoire du profilage, je vais profiler des objets. De cette façon, je pourrai voir combien d'objets existent à une heure précise du programme. Afin de réaliser mon objectif, j'ai utilisé des métaclasses avec une modification minimale au code déjà existant. P>

La métaclass suivante ajoute un sous-programme très simple à __ init __ code> et __ del __ Fonctions de la classe. Le sous-programme pour __ init __ code> augmente le nombre d'objets avec ce nom de classe par un et le __ del __ code> diminue d'un. P> xxx pré> > Les fonctions d'incandcall et de DecandCall utilisent une variable globale du module qu'ils existent. P>

>>> class A:
    __metaclass__=ObjectProfilerMeta
    def __init__(self):
        pass


>>> class B:
    __metaclass__=ObjectProfilerMeta


>>> l=[]
>>> for i in range(117):
    l.append(A())


>>> for i in range(18):
    l.append(B())


>>> counter
{'A': 117, 'B': 18}
>>> l.pop(15)
<__main__.A object at 0x01210CB0>
>>> counter
{'A': 116, 'B': 18}
>>> l=[]
>>> counter
{'A': 0, 'B': 0}


0 commentaires

8
votes

Si vous êtes heureux de profiler des objets plutôt que de la mémoire brute, vous pouvez utiliser le gc.get_objects () fonction de sorte que vous n'avez pas besoin d'une métaclasse personnalisée. Dans les versions Python plus récentes, sys.getsizeof () Vous permettra également de prendre un coup de feu à déterminer la quantité de mémoire sous-jacente utilisée par ces objets.


1 commentaires

C'est bien. Beaucoup plus propre que mon approche.



-1
votes

J'ai utilisé Yappi , que j'ai eu le succès avec pour quelques-uns spéciaux cas multi-filetés. Il a une bonne documentation pour que vous n'ayez pas trop de mal à l'installer.

Pour le profilage spécifique à la mémoire, consultez tasse . Soyez averti, cela peut créer certains des plus grands fichiers journaux que vous ayez jamais vus!


2 commentaires

Malheureusement, je suis au courant de ces deux profileurs et j'ai donné un lien avec des questions connexes qui parlent spécifiquement de Yappi et de Hassepy. Le problème est que Yappi ne profile pas de la mémoire et du tas que des profils que l'utilisation de la mémoire threads principale (plus précisément le fil est appelé à partir de).


@Kushalp. J'ai essayé Yaapi, je pense que cela ne peut pas donner mon heure d'exécution de ligne par ligne. Est-ce que ça me manque quelque chose?