этот вопрос уже задавался несколько раз, и я уже попробовал некоторые методы. К сожалению, почему-то я не могу понять, почему мой процесс 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, где список был расширен без надлежащего условия разрыва.
В любом случае, есть способ найти такие утечки памяти. Я часто вижу, что некоторые пакеты профилирования памяти вызываются явно. В этом случае у меня не было бы возможности сделать дамп памяти или проверить память в главном потоке, поскольку цикл никогда не прекращался.