Профиль памяти. Найти утечку памяти в цикле - PullRequest
0 голосов
/ 04 ноября 2018

этот вопрос уже задавался несколько раз, и я уже попробовал некоторые методы. К сожалению, почему-то я не могу понять, почему мой процесс python использует так много памяти.

Мои настройки: python 3.5.2, Windows 10 и множество сторонних пакетов.

Реальное использование памяти для процесса составляет 300 МБ (слишком много, но иногда оно даже взрывается до 32 ГБ)

process = psutil.Process(os.getpid())
memory_real = process.memory_info().rss/(1024*1024) #--> 300 Mb

Что я пробовал до сих пор:

  • профилировщик строки памяти (мне не помогло)
  • tracemalloc.start (50), а затем
    snapshot = tracemalloc.take_snapshot() top_stats = snapshot.statistics('lineno') print("[ Top 10 ]") for stat in top_stats[:10]: log_and_print(stat) в результате дает всего несколько мегабайт
  • gc.collect() import objgraph objgraph.show_most_common_types() возвращает: function 51791 dict 32939 tuple 28825 list 13823 set 10748 weakref 10551 cell 7870 getset_descriptor 6276 type 6088 OrderedDict 5083 (когда у процесса было 200 мегабайт, числа выше были еще выше)
  • pympler: процесс существует с некоторым кодом ошибки

Так что изо всех сил пытаются найти способ, где память о процессе выделяется. Я делаю что-то не так или есть какой-то простой способ узнать, что происходит?

PS: Я смог решить эту проблему благодаря удаче. Это был плохо закодированный цикл while, где список был расширен без надлежащего условия разрыва. В любом случае, есть способ найти такие утечки памяти. Я часто вижу, что некоторые пакеты профилирования памяти вызываются явно. В этом случае у меня не было бы возможности сделать дамп памяти или проверить память в главном потоке, поскольку цикл никогда не прекращался.

...