Speicherleck in Python

Rana Hasnain Khan 15 Februar 2024
  1. Speicherleck in Python
  2. Identifizieren Sie Speicherlecks in Python
  3. Speicherleck in Python beheben
Speicherleck in Python

Speicherlecks sind ein häufiges Programmierproblem, das schwierig zu debuggen und zu beheben sein kann.

In diesem Artikel wird das Python-Speicherleck anhand kleiner und größerer Beispielprogramme untersucht. Wir werden sehen, wie man die Quelle des Speicherlecks findet und wie man es behebt.

Speicherleck in Python

Wir werden in diesem Artikel nicht auf die Interna des Python-Speicherverwaltungssystems eingehen. Wenn Sie jedoch neugierig sind, wie das Python-Speichersystem funktioniert, können Sie auf den Quellcode der Standardbibliothek von Python und den Code anderer höherer Programmiersprachen verweisen.

Lassen Sie uns nun einige Bibliotheken besprechen, die wir in unseren Beispielen verwenden werden, um das Speicherleck in Python zu untersuchen. Die erste Bibliothek ist die Requests-Bibliothek, die es uns ermöglicht, HTTP-Anfragen an eine bestimmte URL zu stellen.

Anfragen müssen erlernt werden, bevor man mit diesen Technologien fortfahren kann, egal ob REST-APIs oder Web Scraping. Eine Antwort wird zurückgegeben, wenn eine Anfrage an eine URL gesendet wird.

Python-Anwendungen enthalten integrierte Verwaltungsfunktionen sowohl für die Anfrage als auch für die Antwort.

Wir können es einfach mit dem folgenden Befehl installieren.

pip install requests

Nachdem wir die Bibliothek requests installiert haben, werden wir nun das GC-Modul installieren. Es gibt uns Zugriff auf den Python-Garbage Collector.

Es bietet Optionen zum Aktivieren von Kollektoren, Deaktivieren von Kollektoren, Optimieren der Erfassungshäufigkeit, Debuggen und mehr.

In niedrigeren Sprachen wie C und C++ muss der Programmierer alle Ressourcen, die nicht mehr verwendet werden, manuell freigeben. Anders ausgedrückt: Entwickeln Sie Programme zur Verwaltung der Ressource.

Hochsprachen wie Python und Java enthalten jedoch ein Konzept der Papierkorbsammlung, bei dem es sich um eine automatisierte Speicherverwaltung handelt. Die Papierkorbsammlung ist für die Zuweisung und Freigabe von Speicher für ein Programm zuständig.

Die Methoden des GC-Moduls, die wir verwenden werden, sind get_object(), die Methode, die das verfolgte Objekt aus der Papierkorbsammlung liefert. Wir werden auch die Methode collect() verwenden, um das nicht referenzierte Objekt frei von der Liste bereitzustellen, die die Kollektoren kontrollieren.

Identifizieren Sie Speicherlecks in Python

Jetzt werden wir besprechen, wie wir feststellen können, ob beim Ausführen eines Programms ein Speicherleck aufgetreten ist. Beginnen wir mit einem Beispiel und verwenden die oben genannten Bibliotheken, um zu überprüfen, ob ein Leck aufgetreten ist oder nicht.

Wir werden zuerst die zuvor erwähnten Bibliotheken in diesem Beispiel importieren.

# python
import requests
import gc

Dann definieren wir eine Funktion, getGoogle(), die eine Antwort von google.com unter Verwendung der Requests-Bibliothek anfordert und den erhaltenen Statuscode zurückgibt.

Code:

# python
def getGoogle():
    resultGot = requests.get("https://google.com")
    print("Status Code recieved is ", resultGot.status_code)
    return

Jetzt definieren wir eine weitere Funktion, checkMemoryLeak(), in der wir Müllobjekte vor und nach dem Aufruf der Funktion getGoogle() sammeln.

Code:

# python
def checkMemoryLeak():
    print("Memory Leaked before calling getGoogle()")
    print(len(gc.get_objects()))
    getGoogle()
    print("Memory Leaked before calling getGoogle()")
    print(len(gc.get_objects()))


checkMemoryLeak()

Ausgang:

Speicherleck in Python beim Anfordern

Wie Sie im Beispiel sehen können, betrug die Länge des Garbage Collectors vor dem Aufruf der Funktion 17472, und nach dem Aufruf unserer Funktion erhöhte sich die Länge auf 17698. Dies zeigt, dass bei der Ausführung einiger Aufgaben immer ein Speicherleck auftritt.

Wir werden nun besprechen, wie wir den Speicherverlust beheben und so viele Daten wie möglich ohne Speicherverlust sammeln können.

Speicherleck in Python beheben

Wir können das Speicherleck in Python mit der Funktion gc.collect() beheben. Wir werden dasselbe Programm verwenden, es jedoch so modifizieren, dass kein oder nur ein minimaler Speicherverlust auftritt.

In diesem Beispiel rufen wir nach dem Aufruf unserer Funktion getGoogle() direkt gc.collect() auf, wodurch das Speicherleck verringert und das Problem behoben wird.

Code:

# python
import requests
import gc


def getGoogle():
    resultGot = requests.get("https://google.com")
    print("Status Code recieved is ", resultGot.status_code)


def checkMemoryLeak():
    print("Memory Leaked before calling getGoogle()")
    print(len(gc.get_objects()))
    getGoogle()
    gc.collect()
    print("Memory Leaked before calling getGoogle()")
    print(len(gc.get_objects()))


checkMemoryLeak()

Ausgang:

Speicherleck in Python beim Anfordern behoben

Wie Sie im Beispiel sehen können, nimmt die Anzahl der Speicherlecks nach der Verwendung von gc.collect() ab. Auf diese Weise können wir Speicherlecks während des Funktionsaufrufs verhindern.

Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn

Verwandter Artikel - Python Memory