Seite 1 von 1

instanzen und objekte verwalten

Verfasst: Donnerstag 8. Februar 2007, 10:50
von netzmensch
hallo,

ich habe ein großes Problem mit der Verwaltung einer dynamischen Anzahl von Objekten, deren Anzahl sich während der Laufzeit ständig ändert. Wenn ich versuche, das Objekt per del zu löschen, so wird ja nur die Referenz dazu entfernt, nicht aber das Objekt selber. Durch die ständigen Änderungen der Anzahl an Objekten wird mir dadurch irgendwann der Speicher zugemüllt bzw. das Programm schießt sich ab.

Meine Ansätze wären folgende:
1. Ansatz: Alle Referrenzen auf ein Objekt herausfinden und diese entfernen. Anschließend mit gc aufräumen lassen. (Doch wie bekomme ich die Referenzen herausgefunden?)

2. Ansatz: eine Klasse schreiben, die die Verwaltung der Objekte übernimmt, nur leider habe ich da überhaupt keinen Ansatz wie man sowas umsetzen kann.

mfg, netzmensch

Verfasst: Donnerstag 8. Februar 2007, 13:17
von BlackJack
Du kannst weder alle Referenzen so identifizieren, dass Du sie in einer generischen Funktion "lösen" kannst, noch ein Objekt explizit löschen.

Dein Problem ist, das offenbar Referenzen auf Objekte behalten werden, die gar nicht mehr benötigt werden. Ganz einfach gesagt: Lass das!

Wenn Du sagst, Du hast ein Problem mit der Verwaltung dieser Objekte, heisst dass Du versuchst das irgendwie selber mit Programmcode zu tun? Dann ist wahrscheinlich die einfachste Lösung das einfach zu unterlassen. Die Laufzeitumgebung von Python verwaltet die Objekte schon selber ganz gut.

Verfasst: Donnerstag 8. Februar 2007, 13:37
von netzmensch
ich möchte die objekte ja eigentlich gar nicht verwalten, nur werde ich dazu gezwungen.

um das ganze etwas anschaulicher zu machen: konkret geht es bei meinem programm um eine art "netstat", das alle aktiven netzwerk-verbindungen mit hilfe von vpython in einem 3d-raum darstellt. dabei wird für jede erkannte verbindung eine instanz erstellt. falls durch überprüfungen herauskommt, dass die verbindung nicht mehr besteht, so verschwindet diese langsam vom bildschirm (mit hilfe eines faders). wenn die verbindung komplett ausgeblendet ist, so möchte ich, dass die instanz gelöscht wird, weil sie ja nun nicht mehr benötigt wird. da immer wieder zusätzliche verbindungen hinzukommen muss ich eine möglichkeit finden, diese unbenötigten instanzen zu löschen, da sonst wie gesagt mein speicher irgendwann voll ist.

ich hoffe das die problematik nun etwas besser rübergekommen ist.

meine frage ist nun, ob ich nen falschen ansatz gewählt habe oder wie ich das problem auf die von mir gewählte weise löse...

der netzmensch

Verfasst: Donnerstag 8. Februar 2007, 14:31
von keppla
ich möchte die objekte ja eigentlich gar nicht verwalten, nur werde ich dazu gezwungen.
Was am genannten Beispiel zwingt dich zu dieser Verwaltung? Hast du ein konkretes Problem gefunden?

Mal etwas Pseudocode:

Code: Alles auswählen

connections = set([]) # hier sind deine connections drinnen

while True:
  dropped = set([])
  for connection in connections:
    if connection.check_status() == CLOSED:
      connection.fade_out()
      dropped.add(connection)
    else:
      connection.show()

  connections -= dropped
Wenn du nirgendwo sonst referenzen auf die objekte in connections hälst, wird die garbage collection sie löschen können, sobald sie nicht mehr in connections sind.
Es ist nicht so wie in C, dass du alles, was du erstellt hast, selber löschen musst. Den Müll rausbringen übernimmt Python schon für dich, wenn auch in unvorhersehbaren abständen.

Verfasst: Donnerstag 8. Februar 2007, 14:55
von BlackJack
Ich kenne VPython nicht näher, aber bei den meisten 3D-Frameworks fügt man Objekte einem Scenegraph hinzu. Aus dieser Datenstruktur wird ein Objekt also mindestens referenziert. Und das graphische Ausblenden lässt ein Objekt doch wohl nur am Bildschirm verschwinden, aber nicht im Speicher. Entfernst Du nach dem Ausblenden das Objekt auch aus allen Datenstrukturen in die Du es direkt oder indirekt hineingesteckt hast?

Verfasst: Donnerstag 8. Februar 2007, 15:47
von netzmensch
ok, so in der art hatte ich es schon einmal versucht. durch deinen kurzen quelltext bin ich nun auf den richtigen weg gelangt. bin noch relativ neu in python und vor allem in oop, daher muss ich noch immer sehr stark umdenken. aber langsam wird's ;)

Verfasst: Donnerstag 8. Februar 2007, 15:50
von netzmensch
BlackJack hat geschrieben:Ich kenne VPython nicht näher, aber bei den meisten 3D-Frameworks fügt man Objekte einem Scenegraph hinzu. Aus dieser Datenstruktur wird ein Objekt also mindestens referenziert. Und das graphische Ausblenden lässt ein Objekt doch wohl nur am Bildschirm verschwinden, aber nicht im Speicher. Entfernst Du nach dem Ausblenden das Objekt auch aus allen Datenstrukturen in die Du es direkt oder indirekt hineingesteckt hast?
hatte vorher ne liste mit durchnummerierten index'en die jeweils für die verbindungen verteilt wurden. egal, hab nun direkt nen set genommen, so wie in dem beispiel und nun ist jeweils ein set-eintrag eine direkte referenz auf die instanz (und auch die einzigste). somit löscht gc die objekte, deren referenzen ich löschen konnte.

es gibt noch ein paar kleine probleme, die ich noch beheben muss. dann poste ich das ganze mal hier und ihr könnt dann ja sagen was ihr davon haltet.