instanzen und objekte verwalten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
netzmensch
User
Beiträge: 11
Registriert: Montag 5. Februar 2007, 12:36

Donnerstag 8. Februar 2007, 10:50

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
BlackJack

Donnerstag 8. Februar 2007, 13:17

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.
netzmensch
User
Beiträge: 11
Registriert: Montag 5. Februar 2007, 12:36

Donnerstag 8. Februar 2007, 13:37

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
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Donnerstag 8. Februar 2007, 14:31

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.
BlackJack

Donnerstag 8. Februar 2007, 14:55

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?
netzmensch
User
Beiträge: 11
Registriert: Montag 5. Februar 2007, 12:36

Donnerstag 8. Februar 2007, 15:47

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 ;)
[size=75]Edit (Leonidas): Bild in der Signatur nach mehrfacher Warnung gelöscht.[/size]
netzmensch
User
Beiträge: 11
Registriert: Montag 5. Februar 2007, 12:36

Donnerstag 8. Februar 2007, 15:50

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.
[size=75]Edit (Leonidas): Bild in der Signatur nach mehrfacher Warnung gelöscht.[/size]
Antworten