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"?
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 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.
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