6 Stimmen

Haben Python Dictionaries haben alle Speicher freigegeben, wenn neu zugewiesen?

Arbeiten in Python. Ich habe eine Funktion, die aus einer Warteschlange liest und ein Wörterbuch auf der Grundlage einiger der XML-Tags in dem aus der Warteschlange gelesenen Datensatz erstellt und dieses Wörterbuch zurückgibt. Ich rufe diese Funktion in einer Endlosschleife auf. Das Wörterbuch wird jedes Mal neu zugewiesen. Wird der zuvor vom Wörterbuch verwendete Speicher bei jeder Neuzuweisung freigegeben, oder wird er verwaist und verursacht schließlich Speicherprobleme?

def readq():
    qtags = {}
    # Omitted code to read the queue record, get XML string, DOMify it

    qtags['result'] = "Success"
    qtags['call_offer_time'] = get_node_value_by_name(audio_dom, 'call_offer_time')
    # More omitted code to extract the rest of the tags

    return qtags

while signals.sigterm_caught == False:
    tags = readq()
    if tags['result'] == "Empty":
        time.sleep(SLEEP_TIME)
        continue
    # Do stuff with the tags

Also, wenn ich Tags jedes Mal in dieser Schleife neu zuweisen, wird der Speicher, der von der vorherigen Zuweisung verwendet wird, freigegeben, bevor er von der neuen Zuweisung zugewiesen wird?

9voto

Der Speicher eines Objekts wird freigegeben, wenn nachgewiesen werden kann (aufgrund der Kenntnisse, die die Sprachimplementierung zur Laufzeit hat), dass auf das Objekt nicht mehr zugegriffen werden kann und der Garbage Collector es für angebracht hält, eine Sammlung vorzunehmen. Das ist das absolute Minimum, und mehr sollte man nicht annehmen. Und Sie sollten normalerweise nicht müssen sich um nichts mehr kümmern.

Praktischer ausgedrückt, kann sie befreit werden bei einige Zeitpunkt zwischen der letzten Referenz (wobei "Referenz" nicht auf Namen im Geltungsbereich beschränkt ist, sondern alles sein kann, was das Objekt Erreichbar ) entfernt werden und der Speicherplatz knapp wird. Er muss nicht von der Python-Implementierung, die Ihren Code ausführt, freigegeben werden, sie kann die Speicherbereinigung auch dem Betriebssystem überlassen und alle Finalizer und dergleichen vergessen. Beachten Sie, dass es eine merkliche Verzögerung zwischen dem Ableben der letzten Referenz und der tatsächlichen Verringerung des Speicherverbrauchs geben kann. Aber wie bereits erwähnt, bemühen sich die meisten Implementierungen, übermäßigen Speicherverbrauch zu vermeiden, wenn es Müll zu sammeln gibt.

Noch praktischer ist, dass Sie dies wahrscheinlich unter CPython (der Referenzimplementierung) ausführen werden, die immer Referenzzählung verwendet hat und wahrscheinlich auch immer verwenden wird (ergänzt mit einer echten GC, um zyklische Referenzen zu behandeln), so dass, wenn es keine zyklische Referenz gibt (relativ selten und Ihr Code sieht nicht so aus, als hätte er sie, kann aber z.B. in graphenähnlichen Strukturen vorkommen), sie freigegeben wird, sobald die letzte Referenz darauf gelöscht/überschrieben wird. Natürlich sind andere Implementierungen nicht so vorhersehbar - allein PyPy hat ein halbes Dutzend verschiedene Garbage Collectors, die alle bis auf einen unter den obigen Absatz fallen.

2voto

agf Punkte 159286

Nein, es wird freigegeben, NACHDEM das neue Objekt erstellt worden ist.

Damit die Anzahl der Verweise auf das alte Objekt sinkt, tags muss auf das neue Objekt verweisen. Dies geschieht nach readq zurück, so dass zumindest beide Objekte von Anfang an existieren. qtags = {} bis nach tags = readq() .

Wie @delnan feststellte, kurz nach tags auf das neue Objekt verwiesen wurde, wird das alte Objekt vom Garbage Collector freigegeben, da es keinen Verweis mehr darauf gibt.

1voto

TheChes44 Punkte 618

Normalerweise kann Python mit allem mithalten, was man ihm hinwirft. Der in Python verwendete Garbage Collector verwendet Referenzzählung, so dass Ihr Speicherverbrauch in etwa konstant sein sollte, Sie werden keine Spitzen im Speicher sehen. Genau dann, wenn Sie eine Referenz entfernen (die Variable einer anderen Variable zuweisen), wirft der Garbage Collector den Speicher zurück in den "Heap", wenn Sie so wollen. Machen Sie sich also keine Sorgen um den Speicher. Ich habe Simulatoren laufen lassen, die stundenlang das Umschreiben von Variablen getestet haben, aber der Speicherverbrauch bleibt ungefähr gleich. Er wird wieder freigegeben, wenn Sie ihm ein neues Wörterbuch zuweisen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X