Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶不释放内存_Python_Flask - Fatal编程技术网

Python 烧瓶不释放内存

Python 烧瓶不释放内存,python,flask,Python,Flask,我将首先指出我对web开发非常陌生 现在说到重点:我最近构建了一个相当小的Flask应用程序,它加载数据,然后使用bokeh输出数据的可视化效果。因此,它必须将相当多的数据存储在内存中(大约10-20MB)。这本身并不是一个真正的问题,但是,在视图函数发送请求之后,应用程序不会释放内存中的对象。这意味着在使用几次之后,应用程序将耗尽大部分内存 因此,我的问题是:在视图函数返回任何请求后,如何强制Flask释放使用过的对象?还是我把这个问题搞错了?值得一提的是,我使用的是Flask的内置服务器,因

我将首先指出我对web开发非常陌生

现在说到重点:我最近构建了一个相当小的
Flask
应用程序,它加载数据,然后使用
bokeh
输出数据的可视化效果。因此,它必须将相当多的数据存储在内存中(大约10-20MB)。这本身并不是一个真正的问题,但是,在视图函数发送请求之后,应用程序不会释放内存中的对象。这意味着在使用几次之后,应用程序将耗尽大部分内存

因此,我的问题是:在视图函数返回任何请求后,如何强制
Flask
释放使用过的对象?还是我把这个问题搞错了?值得一提的是,我使用的是
Flask
的内置服务器,因为我们仍然只是在进行原型设计。 ¨ 谢谢,廷吉斯

编辑以下是我的视图功能之一。它所做的是,它使用
SQLAlchemy
从数据库加载数据,然后执行一些时间序列操作(如内核密度估计和计算累积回报),并输出一个
div
script
字符串的
bokeh
图,这是以
\u 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)
这有用吗

编辑2我尝试了下面提供的解决方案,在每次调用绘图界面以及函数之后添加一个
gc.collect()

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

但是内存仍然没有释放。

是否可能在
获取会话
和公司对象之间创建循环引用

我们至少需要看一段代码才能知道为什么它会保存内存。当然,唯一的问题是我今天离开办公室了。我明天能给你回电吗?@DanielCasserly上面的代码对你有帮助吗,或者你需要更多吗?你的
get\u会话
函数有可能重复什么功能?我感觉这是一个循环类依赖,gc不知道首先要删除哪个对象(会话或公司),所以它只是将它们保存在内存中