2016-01-14 18 views
8

Inizierò questa domanda indicando che sono molto nuovo allo sviluppo web.Flask non rilasciando memoria

Ora al punto: ho recentemente creato un'applicazione piuttosto piccola Flask che carica i dati e quindi ne visualizza le visualizzazioni utilizzando bokeh. E come tale dovrà conservare un bel po 'di dati immagazzinati in memoria (circa 10-20 mb). Questo di per sé non è davvero un problema, tuttavia l'applicazione non rilascia gli oggetti in memoria dopo che le funzioni di visualizzazione hanno inviato le richieste. Ciò significa che dopo pochi utilizzi l'app avrà svuotato la maggior parte della memoria.

La mia domanda è quindi: Come faccio a forzare Flask per rilasciare gli oggetti utilizzati dopo che le funzioni di visualizzazione hanno restituito eventuali richieste? O sto andando su questo problema nel modo sbagliato? Vale la pena ricordare che utilizzo il server integrato di Flask poiché stiamo ancora solo prototipando. ¨ Grazie, Tingis

EDIT Ecco una delle mie funzioni di visualizzazione. Quello che fa è che carica i dati da un db usando SQLAlchemy e poi fa alcune manipolazioni timeseries (come una stima della densità del kernel e il calcolo del rendimento cumulativo) e restituisce una stringa unita div e script di una cifra bokeh, che sono le variabili che terminano con _plt.

from app import app 
from app.business_logic.classes.interface_classes import Company 
from app.business_logic.functions.functions import get_session 

@app.route('/analysis_tool/company_performance', methods=['GET', 'POST']) 
def analysis_tool__company_performance(): 
    session = get_session() 

    companies_to_analyse = { 
     'Company A': {'ts_to_use': 'Returns of Company A'}, 
     'Company B': {'ts_to_use': 'Returns of Company B'} 
    } 

    chosen_company = request.form.get('security') 
    types_of_plots = {} 

    if chosen_company is not None: 
     company = Company(session, chosen_company) 
     company.load_company() 

     company.load_timeseries(companies_to_analyse[chosen_platform]['ts_to_use']) 
     company.unpack_observations_of_ts_as_df() 

     ret_df = company.manipulate_dataframe('convert timeseries to returns', 
               frequency='monthly', 
               ts_type=company.loaded_ts_orm_obj.ts_type_name) 
     cum_ret_df = company.manipulate_dataframe('calculate cumulative return', df=ret_df) 

     cum_ret_plt = company.plot_dataframe(cum_ret_df, legend=False) 
     kde_plt = company.plot_kde(ret_df) 

     types_of_plots = {'Cumulative_return': cum_ret_plt, 'KDE': kde_plt} 

    return render_template('plotting/plot_using_panels.html', 
          items=sort_dictionary(platforms_to_analyse), 
          plot_types=sort_dictionary(types_of_plots), 
          selected=chosen_company) 

Questo aiuto?

EDIT 2 ho provato la soluzione che è stata fornita nella seguente question, aggiungendo una gc.collect() dopo ogni chiamata all'interfaccia di tracciatura, nonché la funzione

@app.teardown_request 
def teardown_request(exception): 
    gc.collect() 

Ma la memoria isn ancora' t rilasciato.

+0

Avremmo bisogno di vedere almeno una sezione del codice per vedere perché è in possesso della memoria. –

+0

Ovviamente, il solo problema è che ho lasciato l'ufficio per oggi. Posso tornare da te domani? – Tingiskhan

+0

@DanielCasserly Il codice di cui sopra ti aiuta o ne hai bisogno di più? – Tingiskhan

risposta

0

È possibile che si stia creando un riferimento circolare tra get_session e l'oggetto Società?

Problemi correlati