При каких обстоятельствах проблема, которая выглядит как утечка памяти python, не может быть утечкой? - PullRequest
0 голосов
/ 02 марта 2020

У нас есть сценарий python, использующий PyXB и другие библиотеки, который обрабатывает большие объемы данных как XML, так и JSON, и этот сценарий потребляет постоянно увеличивающийся объем ОЗУ, пока у машины не заканчивается память.

Помимо утечки памяти, существуют ли другие обстоятельства, которые могут вызвать такое высокое использование памяти?

1 Ответ

0 голосов
/ 02 марта 2020

В нашем случае причиной утечки было то, что наш код python потреблял ОЗУ быстрее, чем сборщик мусора python был готов очистить мусор.

Решение в нашем случае было принудительно выполнять сборку мусора вручную в конце каждой единицы работы в нашем скрипте следующим образом:

gc.collect()

Это контролировало память.

Доказательство того, что конкретный код, который казался утечка не утечка была подтверждена библиотекой tracemallo c. Мусор был собран, сняты снимки, а затем сопоставлены снимки до и после, чтобы доказать, что дополнительная память не выделялась.

for _ in range(10000):

    gc.collect();
    snapshot1 = tracemalloc.take_snapshot()

    response = test_parsing("assets.xml")
    del response

    gc.collect();
    snapshot2 = tracemalloc.take_snapshot()

    top_stats = snapshot2.compare_to(snapshot1, 'lineno')
    print("[ Non Zero differences ]")
    for stat in top_stats:
        if (stat.size_diff != 0):
            print(stat)

В нашем случае приведенный выше список ненулевых различий был пустым после каждой итерации , доказывая, что утечки не было.

...