Wann wird das cStringIO-Objekt gelöscht?

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich habe ein (Bottle-basierte) Webanwendung, die PDFs generiert. Zum Speichern der PDF benutzte ich ein cStringIO-Objekt. Das ganze sieht verkürzt so aus:

Code: Alles auswählen

import cStringIO
import ...

@bottle.route('schick_pdf')
def schick_pdf():

    ergebnis = bau_pdf()
    bottle.response.header['Content-Type'] = 'application/pdf'
    return ergebnis

def bau_pdf():

    buf = cStringIO.StringIO()
    pdf = Canvas(buf, (29.7 * cm, 21 * cm))
    #hier kommt  Reportlab Code...
    #...
    pdf.showPage()
    pdf.save()
    buf.reset()    
    return buf.read()
Das funktioniert auch so, wie ich es mir vorstelle.

Allerdings schließe ich 'buf' ja nicht mit 'buf.close()' (ich wüßte auch nicht, wo...), daher die Frage: wird buf regelmäßig vom GarbageCollector eingesammelt oder müll' ich mir so den Speicher zu?

Gruß, noisefloor
BlackJack

@noisefloor: Wie kommst Du auf die Idee das Du Dir den Speicher zumüllst und das `close()` etwas dagegen unternehmen könnte!? Wenn die Funktion zurückkehrt verschwindet der lokale Name `buf` und damit auch die Referenz auf das Objekt. Damit wird es früher oder später vom GC abgeräumt.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

`cStringIO`s verhalten sich wie alle anderen Python-Objekte bzgl. GC.

btw, gibt es einen Unterschied zwischen `.read()` und `.getvalue()`? Ich dachte immer, das zweitere sei dafür da, den String-Wert zu bekommen. In deinem Fall könntest du aber glaube ich sogar einfach nur das StringIO-Objekt an den Server zurückgeben, der behandelt das dann wie eine Datei. `.getvalue`/`.read` alloziieren nämlich neuen Speicher.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Wie kommst Du auf die Idee das Du Dir den Speicher zumüllst und das `close()` etwas dagegen unternehmen könnte!? Wenn die Funktion zurückkehrt verschwindet der lokale Name `buf` und damit auch die Referenz auf das Objekt. Damit wird es früher oder später vom GC abgeräumt.
Das hatte ich mir auch so gedacht - war aber nicht sicher, ob das wirklich so ist. Daher: Lieber mal Leute fragen, die mehr Ahnung haben. ;-)
btw, gibt es einen Unterschied zwischen `.read()` und `.getvalue()`? Ich dachte immer, das zweitere sei dafür da, den String-Wert zu bekommen. In deinem Fall könntest du aber glaube ich sogar einfach nur das StringIO-Objekt an den Server zurückgeben, der behandelt das dann wie eine Datei.
Meine Quelle der Inspiration ist ein ReportLab Code Snippet: http://www.reportlab.com/snippets/17/. Wie gesagt, es funktioniert so, wie im Beispiel gezeigt. "Optimiert" habe ich noch nicht. :-)

Gruß, noisefloor
Antworten