Potřebujete pomoci identifikovat únik paměti zahrnující matplotlib a baňku

hlasů
1

Napsal jsem malou webapp pomocí rámce baňky, která zahrnuje vykreslování pomocí matplotlib. Problém je, že pokaždé, když jsem vytvořit děj, proces spotřebovává více paměti.

I nasadili aplikaci pomocí mod_wsgi s soubor .wsgi vypadající prostě takhle:

from yourapplication import app as application

Problémy začít, když jsem přístup k URL, který vytvoří graf. Funkce vytvoří objekt plotru, který při initilized, bere příslušná data z databáze sqlite3 (data se skládají z asi 30 čísel a stejně tak mnoho datetime objekty), vytvoří graf pomocí matplotlib a vrací objekt StringIO který se pak zobrazí na obrazovce ,

To je konec funkce. Celá třída je možné vidět zde

    canvas = FigureCanvas(fig)
    png_output = StringIO.StringIO()
    canvas.print_png(png_output)
    return png_output.getvalue()

Když jsem navštívit stránky, proces je vytvořen s asi 25 MB vyhrazené paměti. Poprvé, když jsem vytvořit graf dorůstá do 30 MB a potom se asi 1 MB pro každé době jsem použít třídu plotru. Výchozí nastavení bylo použito 5 postup, který spotřebovaný příliš mnoho paměti (byl až 150MB během několika minut a já povoleno pouze 80MB).

Jsem velmi nové pro všechny, co tu zapojených (webových frameworků, Apache, databáze), takže nemám žádný pocit, že se všechno mohlo být špatně, takže nějaké nápady jsou vysoce ceněn. Dík!

Položena 12/10/2011 v 14:29
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Přitom po každém volání plot_monthfunkce vyřešil únik.

import gc
gc.collect()
Odpovězeno 13/10/2011 v 18:36
zdroj uživatelem

hlasů
0

Toto vysílání v případě, že pomůže někdo v budoucnu.

Měl jsem stejný problém, a já myslel, že odpověď poskytnuté axel22 nevyřeší problém pro mě.

Po trochu šťourat jsem si uvědomil, že tam byly dva problémy:

  1. Nechtěl jsem vymazat postavu Matplotlib , takže ji v paměti navždy
  2. Volám sběrač odpadků ve špatné části svého kódu

prvním problémem

Dělal jsem něco takového ( NESPRÁVNÝ ):

fig = util.create_figure(....)
output = io.BytesIO()
canvas = FigureCanvas(fig)
canvas.print_png(output)

ale potřeboval jsem to udělat ( SPRÁVNĚ ):

fig = util.create_figure(....)
output = io.BytesIO()
canvas = FigureCanvas(fig)
canvas.print_png(output)
# Clears the figure from memory
fig.clf()

druhý problém

Volám sběrač odpadků ve špatné části svého kódu. Musíte ji volat mimo oblast, kde FigureCanvas se nazývá.

To nefungovalo ( NESPRÁVNÝ ):

import gc

def do_something():
    canvas = FigureCanvas(fig)
    png_output = StringIO.StringIO()
    canvas.print_png(png_output)
    gc.collect()
    return png_output.getvalue()

do_something()

Ale to fungovalo ( SPRÁVNĚ ):

import gc

def do_something():
    canvas = FigureCanvas(fig)
    png_output = StringIO.StringIO()
    canvas.print_png(png_output)
    return png_output.getvalue()

do_something()
gc.collect()
Odpovězeno 16/08/2019 v 17:27
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more