Je travaille sur une bibliothèque qui charge des fichiers (hfd5 - pytables) dans une structure d'objet. Les classes réelles utilisées pour la structure est chargée comme une chaîne à partir du fichier hdf5, puis chargés de cette façon:En python, comment pouvez-vous décharger des classes générées
class NamespaceHolder(dict):
# stmt is the source code holding all the class defs
def execute(self, stmt):
exec stmt in self
Le problème est, le chargement de plusieurs classes comme celui-ci, fait que les objets apparaissent dans la irrécouvrable une partie de la collection de garbage, à savoir les définitions de classe réelles. Je peux aussi charger ceci dans un dictionnaire global, mais le problème reste des classes orphelines. Est-il possible de décharger les classes?
Le principal problème est la classe. mro attribut, qui contient une référence à la classe elle-même, provoquant des références circulaires que le garbage collector ne peut pas gérer.
Voici un petit boîtier de test pour voir par vous-mêmes:
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)
Juste une remarque: je l'ai déjà fait valoir contre l'utilisation de l'analyse de texte dans un fichier pour créer des classes plus tôt, mais apparemment ils sont mis sur l'utilisation ici et voir des avantages que je n'ai pas, alors s'éloigner de cette solution n'est pas réalisable maintenant.
En fait, s'éloigner de cette non-solution est toujours faisable. S'il encombre la mémoire avec une corbeille irrécupérable, cela ne fonctionne pas. –
Je me souviens avoir lu quelque part (comp.lang.python? La liste Python-Dev? Ne me souviens pas où) que l'équipe de base de développement sait parfaitement que les objets de classe ne peuvent pas être collectés, et IIRC Guido a dit "si vous 'est de créer dynamiquement dans votre code des milliers de classes, il y a quelque chose qui cloche avec votre algorithme', mais ICBW. – tzot