[PYTHON] Filtern Sie die Ausgabe von tracemalloc

Derzeit gibt es ein Standardmodul namens "tracemalloc" als Modul zum Überprüfen, welche Variable wie viel Speicher in einem Python-Programm reserviert.

Wenn Sie dies beispielsweise verwenden, indem Sie einen solchen Code schreiben, können Sie das Auslassen der Speicherfreigabe eines bestimmten Prozesses überprüfen.

Code, der tracemalloc direkt aufruft


import tracemalloc

tracemalloc.start()
snap1 = tracemalloc.take_snapshot()
size1 = sum([stat.size for stat in snap1.statistics("filename")])
for stat in snap1.statistics('lineno')[:10]:
  print(stat)
# ...Einige Verarbeitung...
snap2 = tracemalloc.take_snapshot()
size2 = sum([stat.size for stat in snap2.statistics("filename")])
for stat in snap2.compare_to(snap1, 'lineno')[:10]:
  print(stat)
diff = abs(size1 - size2)
print("Speicherplatz nach der Verarbeitung{:,}Teilzeitstelle".format(diff))    

Wenn Sie die with-Syntax verwenden, sieht es so aus

Klassifiziert für die Verwendung der Syntax mit


import tracemalloc

class MemCheck:
  """
Eine Klasse zum Durchführen von Speicherprüfungen. Wird in der with-Syntax verwendet.
Beim Beenden mit wird automatisch eine Prüfung durchgeführt.
  """

  def __init__(self):
    """
Initialisieren
    """
    pass

  def __enter__(self):
    tracemalloc.start()
    self.snap = tracemalloc.take_snapshot()
    self.size = sum([stat.size for stat in self.snap.statistics("filename")])
    print("")
    print("-----TEST START!!!!-----")
    for stat in self.snap.statistics('lineno')[:10]:
      print(stat)
    return self

  def __exit__(self, ex_type, ex_value, trace):
    print("-----TEST END!!!!!!-----")
    snap = tracemalloc.take_snapshot()
    size = sum([stat.size for stat in snap.statistics("filename")])
    for stat in snap.compare_to(self.snap, 'lineno')[:10]:
      print(stat)
    diff = abs(self.size - size)
    print("Speicherplatz nach der Verarbeitung{:,}Teilzeitstelle".format(diff))
    print("-" * 20)
    return False

def main():
  with MemCheck():
    # ...Einige Verarbeitung...

Wenn Sie dies jedoch tatsächlich verschieben, enthalten die Objekte, die Speicher verwenden, das Innere des Tracemalloc-Moduls und das Objekt für den Betrieb des Debuggers. Daher ist es etwas mühsam, es zum Testen von Speicherfreigabelecks zu verwenden.

Zu diesem Zweck gibt es eine Methode namens filter_traces () zum Filtern der Daten.

Wenn Sie sich das Dokument ansehen, werden jedoch nur zwei Beispiele geschrieben. Dies entspricht der Situation, dass "Ich möchte das Objekt zum Debuggen vollständig ignorieren" oder umgekehrt "Ich möchte nur den von mir geschriebenen Code testen". kann nicht.

Was soll ich tun, wenn ich einen Ordnernamen angebe und sage "Ich möchte nur die Dateien unter diesem Ordner verfolgen"?

mach das

Sie können es wie folgt schreiben.

Ein Beispiel, das die with-Syntax mit einem hinzugefügten Filter verwendet


import tracemalloc
from pathlib import Path

class MemCheck:
  """
Eine Klasse zum Durchführen von Speicherprüfungen. Wird in der with-Syntax verwendet.
Beim Beenden mit wird automatisch eine Prüfung durchgeführt.
  """

  def __init__(self):
    """
Initialisieren
    """
    pass

  def __enter__(self):
    tracemalloc.start()
    self.snap = tracemalloc.take_snapshot().filter_traces(self.get_filter_traces())
    self.size = sum([stat.size for stat in self.snap.statistics("filename")])
    print("")
    print("-----TEST START!!!!-----")
    for stat in self.snap.statistics('lineno')[:10]:
      print(stat)
    return self

  def __exit__(self, ex_type, ex_value, trace):
    print("-----TEST END!!!!!!-----")
    snap = tracemalloc.take_snapshot().filter_traces(self.get_filter_traces())
    size = sum([stat.size for stat in snap.statistics("filename")])
    for stat in snap.compare_to(self.snap, 'lineno')[:10]:
      print(stat)
    diff = abs(self.size - size)
    print("Speicherplatz nach der Verarbeitung{:,}Teilzeitstelle".format(diff))
    print("-" * 20)
    return False

  #hinzufügen
  def get_filter_traces(self):
    return (
      tracemalloc.Filter(True, str(Path(__file__).parent.parent / ".venv" / "lib" / "site-packages" / "*")),
      tracemalloc.Filter(True, str(Path(__file__).parent.parent / "src" / "*")),
    )

def main():
  with MemCheck():
    # ...Einige Verarbeitung...

Die Methode "get_filter_traces ()" im Code ist die Methode, die die Filterliste für die Methode "filter_traces ()" zurückgibt. Ich mache das, weil ich möchte, dass der Filter auf alle Snapshot-Erfassungsprozesse angewendet wird.

Das Argument der Methode "filter_traces ()" empfängt jetzt ein Tapple des Objekts "tracemalloc.Filter", und das Objekt "tracemalloc.Filter" hat das erste Argument des Konstruktors, das "anzeigt, was mit diesem Filter übereinstimmt". Geben Sie "(True)" oder "Inkonsistenzen anzeigen (False)" an und geben Sie den Dateinamen an, der im Filter im zweiten Argument (filename_pattern) angegeben werden soll.

Wenn Sie sich diesen Dateinamen und das Dokument ansehen, wird "Dateinamenmuster des Filters (str). Schreibgeschützte Eigenschaft" angezeigt. Gibt eine Shell-formatierte Platzhalterzeichenfolge an, die verarbeitet werden kann.) **

Wenn Sie es gewohnt sind, Mustervergleiche wie reguläre Ausdrücke zu verwenden, denken Sie vielleicht, dass Muster = regulärer Ausdruck ist. Beachten Sie jedoch, dass es sich nicht um einen regulären Ausdruck handelt. Wenn ja, wollte ich, dass Sie einen Kommentar schreiben, der Sie so viel verstehen lässt ...

Wenn nur die Dateien unter dem Ordner src für die Ablaufverfolgung vorgesehen sind, wird möglicherweise nichts angezeigt.

Wenn Sie nicht das Programm selbst geschrieben haben, sondern das Objekt, das Sie in dem von Ihnen geschriebenen Programm aufgerufen haben **, sollten Sie es selbst mit tracemalloc.take_snapshot () schreiben. Es ist ** die Zeilennummer der Quelldatei, die das aufgerufene Objekt definiert ** anstelle der Zeilennummer der Quelldatei (ich habe PyPDF.PdfFileReader in meinem Programm aufgerufen und der dort gelesene Speicher wurde nicht freigegeben In dem Fall wird "Speicher in den Dateien unter" \ lib \ site-packages \ PyPDF2 \ "zugewiesen" angezeigt).

Stellen Sie daher beim Erstellen eines Filters sicher, dass Sie nicht nur den Ordner "under the src", sondern auch den Ordner "des aufrufenden Moduls" wie im obigen Beispiel angeben. Wenn der Ordner für die virtuelle Umgebung im Projekt erstellt wird, ist es in Ordnung, wenn sich das Suchziel wie oben beschrieben um ".venv \ lib \ site-packages \ *" befindet.

Wie haben Sie es bemerkt?

Ich öffnete die Datei C: \ PythonNN \ Lib \ tracemalloc.py und folgte dem Filterprozess (Balken).

Ich möchte, dass Sie das Verhalten verzeihen, das Sie ohne dies nicht verstehen können ...

Recommended Posts

Filtern Sie die Ausgabe von tracemalloc
Geben Sie die Anzahl der CPU-Kerne in Python aus
Einstellung zur Ausgabe des Protokolls zur Ausführung von cron
Lesen Sie die Ausgabe von subprocess.Popen in Echtzeit
Ausgabe in Form eines Python-Arrays
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Der Beginn von cif2cell
der Zen von Python
Die Geschichte von sys.path.append ()
Grundlagen von Python: Ausgabe
Rache der Typen: Rache der Typen
Zeigen Sie nach und nach die Ausgabe des Befehls an, der von subprocess.Popen ausgeführt wird
Option [Python] zum Deaktivieren der Ausgabe von click.progressbar
Ich habe die Ausgabespezifikationen von Bidirectional LSTM von PyTorch überprüft
Geben Sie das Ausgabeergebnis von sklearn.metrics.classification_report als CSV-Datei aus
Scraping das Ergebnis von "Schedule-Kun"
Die Geschichte des Baus von Zabbix 4.4
Speichern Sie die Ausgabe von GAN nacheinander ~ Mit der Implementierung von GAN durch PyTorch ~
Auf dem Weg zum Ruhestand von Python2
Vergleichen Sie die Schriftarten von Jupyter-Themen
Erläutern Sie den Code von Tensorflow_in_ROS
Filterbetrieb (Keine, Liste)
Verwenden Sie die Clustering-Ergebnisse erneut
GoPiGo3 des alten Mannes
Berechnen Sie die Anzahl der Änderungen
Die Popularität von Programmiersprachen
Ändern Sie den Stil von matplotlib
Visualisieren Sie die Flugbahn von Hayabusa 2
Über die Komponenten von Luigi
Verknüpfte Komponenten des Diagramms
Ausgabe Debug-Ausgabe des Kelchbefehls
Keras Ich möchte die Ausgabe einer beliebigen Ebene erhalten !!
Über die HOG-Ausgabe von Scikit-Image
Über die Funktionen von Python
Geben Sie das Ergebnis der Gradientenabstiegsmethode als Matplotlib-Animation aus
Simulation des Inhalts der Brieftasche
Die Kraft der Pandas: Python
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
Amazon Rekognition Filter-Funktion beim Registrieren von Gesichtern ・ Begrenzen der Anzahl der Gesichter
Verstehen Sie die Anzahl der Eingabe- / Ausgabeparameter des Faltungs-Neuronalen Netzes
Ausgabezeilen mit der angegebenen Zeichenfolge
Die Spezifikationen von Pytz haben sich geändert
Finden Sie die Definition des Wertes von errno
Der Tag des Dockerlaufs (Hinweis)
Zeichnen Sie die Ausbreitung des neuen Koronavirus
Die Geschichte von Python und die Geschichte von NaN
Erhöhen Sie die Version von pyenv selbst
Holen Sie sich die Anzahl der Ansichten von Qiita
[Python] Der Stolperstein des Imports
Erster Python 3 ~ Der Beginn der Wiederholung ~
Japanische Übersetzung des e2fsprogs-Handbuchs
Ändern Sie den Hintergrund von Ubuntu (GNOME)
Ist die Niederschlagswahrscheinlichkeit korrekt?
Implementierung eines einfachen Partikelfilters
Ich habe den Mechanismus der Flaschenanmeldung untersucht!
Verstehen Sie den Inhalt der sklearn-Pipeline