Python Google App Engine не может освободить память массива объектов - PullRequest
8 голосов
/ 04 июня 2019

Я использую GAE (google app engine), создаю очень простое веб-приложение. в методе обработки запроса я просто создаю большой массив объектов. После этого я удаляю все ссылки на массив. После этого я звоню 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 automatic_scaling: max_instances: 1

Вот изображение использования памяти: Please View the image of memory usage

1 Ответ

0 голосов
/ 13 июня 2019

Этот график не выглядит так, как будто ваше использование памяти «продолжает увеличиваться». Скорее это выглядит довольно плоским. Если бы у вас была значительная утечка памяти, график вместо этого увеличился бы.

Процесс Python должен получить память от операционной системы, а затем использовать эту память для хранения ваших объектов Python. Когда объекты Python собираются мусором, память, занимаемая этими объектами, становится свободной для процесса Python , потому что там могут храниться новые объекты. Но для операционной системы эта память все еще принадлежит процессу Python, поэтому она используется. Я полагаю, ваш график показывает использование памяти этим процессом Python.

Память, полученная от операционной системы, запрашивается гораздо большими кусками, чем необходимо для одного объекта Python. И это должно было бы быть возвращено в кусках лагера также. Когда объекты Python распределяются, а затем собираются мусором, оставшиеся живые объекты распределяются по огромному фрагменту памяти. Если бы процесс Python хотел освободить память обратно в операционную систему, ему пришлось бы переместить все объекты в компактную область, чтобы огромная непрерывная область стала свободной. Процессу проще и быстрее просто удерживать память и использовать ее по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...