2016-01-14 27 views
8

Bu soruyu web geliştirme konusunda çok yeni olduğuma işaret ederek başlayacağım.Flask belleği serbest bırakmıyor

Şimdilik: Son zamanlarda veri yükleyen ve ardından bokeh kullanarak görselleştirmelerini çıkaran oldukça küçük bir Flask uygulaması oluşturdum. Ve böylelikle bellekte çok fazla veri saklamak zorunda kalacak (yaklaşık 10-20 mb). Bu kendi başına bir problem değildir, ancak uygulama, işlevlerin istekleri gönderdikten sonra bellekteki nesneleri serbest bırakmaz. Bunun anlamı sadece birkaç kullanımdan sonra uygulamanın hafızanın çoğunu boşaltacağıdır.

Sorum şu: Görünüm işlevleri herhangi bir istekte bulunulduğunda kullanılan nesneleri serbest bırakmak için Flask'u nasıl zorlayabilirim? Yoksa bu problemi yanlış yoldan mı yapıyorum? Hala sadece prototipleme yaptığımız için Flask sunucusunda yerleşik sunucu kullandığımı belirtmek faydalı olabilir. ¨ sayesinde İşte benim bakış fonksiyonlarının biri

EDIT Tingis. Yaptığı şey, bir db'den SQLAlchemy'u kullanarak veri yükler ve sonra bazı zamanlar işlemlerini (çekirdek yoğunluğu tahmini ve kümülatif geri dönüş hesaplaması gibi) yapar ve bokeh şeklindeki bir div ve script dizgisi çıktıları ile biten değişkenlerdir. _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) 

Bu yardımcı olur mu?

DÜZENLEME 2 I

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

Ancak bellek hala diye bir şey yok çizim arayüzüne her çağrı ardından gc.collect() ekleme hem de işlevi tarafından aşağıdaki question sağlandı çözüm çalıştı serbest bırakıldı.

+0

Neden belleğin tutulduğunu görmek için kodun en az bir bölümünü görmemiz gerekir. –

+0

Tabii ki, sadece sorun şu ki, bugün ofisten ayrıldım. Yarın sana geri dönebilir miyim? – Tingiskhan

+0

@DanielCasserly Yukarıdaki kod parçası size yardımcı mı, yoksa daha fazlasına mı ihtiyacınız var? – Tingiskhan

cevap

0

get_session ve Şirket nesnesi arasında dairesel bir başvuru oluşturuyor musunuz?