Objekte speicherfrei löschen mit list.remove()?

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
yanone
User
Beiträge: 7
Registriert: Freitag 12. Januar 2007, 01:05

Hallo everybody,

ich programmiere für einen Online-Service, der Python Sessions persistent speichert (im Moment mittels mod_python).
Das möchte ich nutzen, um Objekte in einem Dictionary zu speichern, zusammen mit einer Funktion, die diese Objekte auf Anfrage ausliefert. Dazu wird ein Timestamp pro Abruf gespeichert, und ab einer bestimmten Anzahl Objekte in der Liste sollen die ältesten aus dem Speicher gelöscht werden. Ein einfacher Objekte-Cache also.

Hier die Frage, wie man das sicher erledigt, so dass der Speicher auch während der laufenden Sitzung wieder freigegeben wird? Reicht ein einfaches list.remove() oder pop() oder so aus?

Vielen Dank
deets

Python hat einen garbage collector und referenze-counting, und wenn du wirklich alle Referenzen auf ein Objekt entfernt hast, dann wird ueblicherweise auch der Speicher freigegeben. Eine Garantie *wann* das passiert wird dir zwar nicht gegeben, aber *das* es passiert ist recht offensichtlich, da Python nicht streng monoton steigenden Speicherbedarf hat ;)

Insofern, ohne mehr von deinem Code zu kennen: ja.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ja, es reicht aus, um den Namen für den Garbage Collector freizugeben. Beachte aber, dass es keine Garantie dafür gibt, wann bzw ob überhaupt der Speicher durch den GC freigegeben wird. Es gibt in Python so gesehen keine Möglichkeit, den Speicher explizit freizugeben.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

snafu hat geschrieben:Es gibt in Python so gesehen keine Möglichkeit, den Speicher explizit freizugeben.
Nun ja, es gibt gc.collect(), aber es ist eigentlich wirklich müßig, sich selber darum zu kümmern.
BlackJack

@/me: Damit gibt man aber nicht explizit Speicher frei, sondern gibt der Speicherbereinigung einen Hinweis sie könnte doch mal laufen. Dabei muss sie aber nicht allen Speicher freigeben den sie könnte. Machen auch nicht alle Python-Implementierungen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:@/me: Damit gibt man aber nicht explizit Speicher frei, sondern gibt der Speicherbereinigung einen Hinweis sie könnte doch mal laufen. Dabei muss sie aber nicht allen Speicher freigeben den sie könnte. Machen auch nicht alle Python-Implementierungen.
Ich habe es beim Lesen auch als deutlichen, aber nicht absolut verbindlichen Hinweis interpretiert. Irgendwie gehört das für mich zu solchen Mysterien wie __del__. Es ist vorhanden, aber man möchte es nicht wirklich einsetzen.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

/me hat geschrieben:Irgendwie gehört das für mich zu solchen Mysterien wie __del__. Es ist vorhanden, aber man möchte es nicht wirklich einsetzen.
__del__ braucht man hauptsächlich, wenn man Speicher freigeben muss, auf die der Python-Interpreter keinen Zugriff hat. Beispielsweise durch externe C-Bibliotheken erzeugte Objekte. Dann will man das __del__ zwar auch nicht einsetzten, aber man muss.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@/me: Entschuldigung, aber es ist ein Fakt, dass man mit den Boardmitteln aus der Standardbibliothek definitiv keine explizite Speicherfreigabe veranlassen kann. Ich habe keine Ahnung, inwiefern es über die C-API funkioniert. Mit der von dir gezeigten Funktion wird jedenfalls definitiv kein Speicher explizit freigegeben. Ich betone das absichtlich so, weil ich mich natürlich den Ausführungen von deets anschließe: Man kann eigentlich schon davon ausgehen, dass Objekte, welche nicht mehr referenziert werden, relativ zeitnah freigegeben werden (bzw deren Platz im Speicher natürlich). Eventuell existieren auch Drittmodule für diese Aufgabe. Wie gesagt, das weiß ich nicht. Ich wollte aber nochmal klarstellen, dass Speicherfreigabe nicht das selbe ist, wie das Löschen von Namen.

Im Übrigen werden solche Überlegungen erst dann relevant, wenn tatsächlich spürbare Performance-Einbußen beim Programm bestehen. Andernfalls dürfte `del` völlig ausreichen. Optimalisierungen ohne spürbaren Gewinn sorgen nur für eine unnötige Verkomplizierung des Programms und sollten vermieden werden. Im Prinzip hat sowas dann nicht mal den Namen "Optimalisierung" verdient. ;)
Antworten