У меня трудности с пониманием автоматического c управления памятью Python. Я знаю, что есть механизм подсчета ссылок; и когда число ссылок на объект достигает нуля, память, выделенная этому объекту, освобождается. Но происходит ли это немедленно? Т.е. освобождается ли память, как только больше нет ссылок на объект? Или такие объекты будут помечены, и их память будет освобождена в будущем (возможно, определяется независимым циклом очистки)?
Конкретнее, у меня есть такая программа:
for param in param_list:
result = process(param) # `process` is a memory-hungry routine
result_list.append(result)
(На самом деле process
создает большие numpy
массивы и матрицы.)
Я успешно запустил программу для небольшого param_list
. Но когда я увеличил размер param_list
, ядро его убило из-за ошибок нехватки памяти. (Обратите внимание, что result
не является огромным объектом, он содержит только пару float
с.) Это было неожиданностью, так как я ожидал, что как только функция process
завершит всю память, выделенную для объектов, которые она создает, освобожден (следовательно, использование памяти программой практически не зависит от числа for
l oop итераций).
Когда я наблюдаю за использованием памяти программой, я вижу, что использование памяти последовательно увеличивается итерации for
l oop. Это естественное поведение системы управления памятью Python? Есть ли способ избежать роста использования памяти?