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ı.
Neden belleğin tutulduğunu görmek için kodun en az bir bölümünü görmemiz gerekir. –
Tabii ki, sadece sorun şu ki, bugün ofisten ayrıldım. Yarın sana geri dönebilir miyim? – Tingiskhan
@DanielCasserly Yukarıdaki kod parçası size yardımcı mı, yoksa daha fazlasına mı ihtiyacınız var? – Tingiskhan