【问题标题】:Python Google App Engine can not release memory of object arrayPython Google App Engine 无法释放对象数组的内存
【发布时间】:2019-10-19 17:43:36
【问题描述】:

我使用 GAE(谷歌应用引擎),制作了一个非常简单的网络应用程序。 在处理请求的方法中,我只是创建了一大堆对象。 之后,我删除了对数组的所有引用。 之后,我调用 gc.collect。

但是当我长时间测试(发送请求)时,Dashboard 的内存使用量不断增加。

我看起来像内存泄漏。 但我认为代码还可以。

以下是示例代码。

from flask import Flask, request

import gc

app = Flask(__name__)

@app.route('/', methods=['POST'])
def hello():

    gc.enable()

    bigArr = []
    for x in range(10000):
        raw_data = request.get_data(cache=False)
        bigArr.append(raw_data)
        del raw_data

    print('len(bigArr):' + str(len(bigArr)))
    del bigArr
    gc.collect()

    return 'Hello World'


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=True)

应用引擎配置: 运行时:python37 自动缩放: 最大实例数:1

这是内存使用情况的图像:

【问题讨论】:

  • 我想补充更多信息,配置如下:runtime: python37 automatic_scaling: max_instances: 1
  • 很多人都有这个问题,但我从来没有看到一个令人满意的解释为什么 Python 不能更快地释放内存。您会认为超出范围的变量足以释放内存。我希望 Python 专家能介入并解释这一点。
  • 一些可能有用的链接:NDB cachingmleaktrack Apptrace

标签: python google-app-engine memory-management memory-leaks


【解决方案1】:

该图表看起来不像您的内存使用量“持续增加”。相反,它看起来很平坦。如果您有严重的内存泄漏,则图表会上升。

Python 进程需要从操作系统获取内存,然后使用该内存来存储您的 Python 对象。当 Python 对象被垃圾回收时,这些对象占用的内存将变为空闲对 Python 进程,因为新对象可以存储在那里。但对于操作系统而言,该内存仍归 Python 进程所有,因此它正在使用中。我想您的图表显示了该 Python 进程的内存使用情况。

从操作系统获得的内存被请求的块比单个 Python 对象所需的块大得多。它也必须以更大的块返回。当 Python 对象被分配并随后被垃圾收集时,剩余的活动对象分布在巨大的内存块中。如果 Python 进程想要将内存释放回操作系统,它必须将所有对象移动到一个紧凑的区域,以便一个巨大的、连续的区域变得空闲。只需保留内存并根据需要重新使用它,该过程会更容易、更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2021-01-02
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多