Y a-t-il un moyen de profiler la mémoire d'un programme multithread en Python? p>
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. P>
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? P>
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? P>
Aussi une autre question concernant la mémoire profileur: Profileur de mémoire Python P>
4 Réponses :
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 p>
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.
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>
>>> 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}
Si vous êtes heureux de profiler des objets plutôt que de la mémoire brute, vous pouvez utiliser le gc.get_objects () code>
fonction de sorte que vous n'avez pas besoin d'une métaclasse personnalisée. Dans les versions Python plus récentes, sys.getsizeof () code> a > Vous permettra également de prendre un coup de feu à déterminer la quantité de mémoire sous-jacente utilisée par ces objets. P>
C'est bien. Beaucoup plus propre que mon approche.
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. P>
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! P>
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?
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.