Ich arbeite an einer Bibliothek, die Dateien (Hfd5 - Pytables) in eine Objektstruktur lädt. Die tatsächlichen Klassen für die Struktur verwendet wird, werden als String aus der hdf5 Datei geladen und dann auf diese Weise geladen:In Python, wie können Sie generierte Klassen entladen
class NamespaceHolder(dict):
# stmt is the source code holding all the class defs
def execute(self, stmt):
exec stmt in self
Das Problem ist, mehrere Klassen wie diese laden, Objekte verursacht in den uneinbringlichen zu erscheinen Teil der Garbage Collection, nämlich die eigentlichen Klassendefinitionen. Ich kann das auch in ein globales Wörterbuch laden, aber das Problem bleibt von verwaisten Klassen. Gibt es eine Möglichkeit, die Klassen zu entladen?
Das Hauptproblem ist die Klasse. mro Attribut, das einen Verweis auf die Klasse selbst enthält, der zirkuläre Referenzen verursacht, die der Garbage Collector nicht verarbeiten kann.
Hier ist ein kleiner Testfall für mich selbst zu sehen:
import gc
if __name__ == "__main__":
gc.enable()
gc.set_debug(gc.DEBUG_LEAK)
code = """
class DummyA(object):
pass
"""
context = {}
exec code in context
exec code in context
gc.collect()
print len(gc.garbage)
Nur ein Hinweis: Ich habe argumentiert, bereits gegen früher für die Erstellung von Klassen in einer Datei Parsen aus Text verwenden, aber anscheinend sind sie setzen auf mit es hier und sehen einige Vorteile, die ich nicht, so weg von dieser Lösung ist jetzt nicht machbar.
Eigentlich weg von dieser Nicht-Lösung ist immer machbar. Wenn es Speicher mit nicht-sammelbarem Papierkorb überfüllt, funktioniert es nicht. –
Ich erinnere mich irgendwo lesen (comp.lang.python? Die Python-Dev-Liste? Kann mich nicht erinnern, wo), dass das Core-Dev-Team ganz gut die Tatsache, dass Klassenobjekte nicht gesammelt werden können, und IIRC Guido sagte "wenn Sie "In Ihrem Code erstellen Sie dynamisch Tausende von Klassen, da stimmt etwas nicht mit Ihrem Algorithmus", sondern ICBW. – tzot