2009-10-29 3 views
16

Gibt es eine Möglichkeit, ein Objekt manuell zu entfernen, das die Speicherbereinigung selbst dann nicht mehr entfernt, wenn ich gc.collect() anrufe? Arbeiten in Python 3.0Manuelle Speicherbereinigung in Python

+1

Ich weiß nichts über Python, aber einige Garbage Collectors werden manchmal fälschlicherweise denken, dass die Dinge immer noch verwendet werden, weil sie herausfinden, was * als Referenzen zu diesen Objekten * erscheinen (aber eigentlich nicht sind). In solchen Fällen können Sie nicht viel tun. – Artelius

+1

Sie sollten auch so schnell wie möglich zu Python 3.1 wechseln. 3.0 hat eine Reihe bekannter Probleme und wird nicht mehr unterstützt. –

+2

Sobald ich die Ehrungen beende, habe ich vor. – Casebash

Antwort

24

Per the docs, gc.get_referrers(thatobject) werden Ihnen sagt, warum das Objekt noch am Leben ist (es richtig nach einem gc.collect() sicher dem unerwünschten „Vitalitäts“ zu machen wird hartnäckig sein). Danach ist es irgendwie eine schwarze Kunst ;-). Sie werden oft feststellen, dass einige der Referrer Listen sind (also WARUM ist diese Liste bezieht sich auf thatobject? Sie können .remove es in einem Notfallmodus, aber machen den normalen Code Sound ist besser ...), und noch öfter, dict s (von denen viele s von einer Klasseninstanz oder anderen sein können - oft nicht trivial, um herauszufinden, welche ... wieder, Brute-Force-Entfernung ist manchmal eine sinnvolle Notfalllösung, aber nie eine nachhaltige Long-Range ! -).

1

Es hängt davon ab, auf was Ihr Python läuft. Here's good article, die die Details

Zitiert erläutert:

In aktuellen Versionen von CPython jede neue Zuordnung zu x innerhalb der Schleife, die zuvor zugewiesene Ressource freizugeben. Mit GC ist dies nicht garantiert. Wenn Sie Code schreiben möchten, der mit jeder Python-Implementierung funktioniert, sollten Sie die Ressource explizit schließen. dies unabhängig von GC arbeiten:

for name in big_list: 
    x = Resource() 
    do something with x 
    x.close() 
4

Wenn der GC, es zu zerstören weigert sich, es ist, weil Sie einen Verweis auf sie irgendwo haben. Befreien Sie sich von der Referenz und es wird (irgendwann) gehen. Zum Beispiel:

myRef = None 

Beachten Sie, dass GC nicht notwendigerweise Ihr Objekt zerstören, wenn sie ihn braucht.

Wenn Ihr Objekt Ressourcen nicht unter der Verwaltung von Python hält (z. B. einige Tricks mit C-Code aus Python), sollte das Objekt einen Ressourcenfreigabeaufruf bereitstellen, damit Sie es tun können, wann Sie wollen und nicht wenn Python entscheidet .

4

del Oder None sind Ihre nur Freunde

>>> a = "Hello" 
>>> a = None 
Or 
>>> del a 
+1

Nicht unbedingt wahr. Das Objekt muss nur unerreichbar sein (oder eine angenehm verfügbare ref-count haben, die hoffentlich mit der vorherigen übereinstimmt), um für eine Reklamation in Frage zu kommen. –

+5

'del a' löscht das Objekt nicht (nur eine Anmerkung; nicht impliziert, dass Sie das implizieren) – hasen