растущая память процесса Python с течением времени - PullRequest
8 голосов
/ 23 июня 2010

Моя память процесса кода Python динамически увеличивается, поскольку она сохраняет динамические данные в списке, словаре и кортежах, где это необходимо.Хотя все эти динамические данные очищаются физически в их переменных после этого, память не сбивается.

Следовательно, я чувствовал, что произошла утечка памяти, и я использовал метод gc.collect (), чтобы собрать всю несвободную память.Но я не мог сделать память минимальной, когда в переменных нет данных.

Ответы [ 2 ]

6 голосов
/ 23 июня 2010

Как правило, процессу очень трудно "вернуть память ОС" (пока процесс не завершится и ОС не вернет всю память, конечно), потому что (в большинстве реализаций) то, что возвращает malloc, вырезано из больших блоков для эффективности, но весь блок не может быть возвращен, если какая-то его часть все еще используется - так, большинство стандартных библиотек C даже не пытаются.

Для достойного обсуждения в контексте Python см., Например, здесь .Эван Джонс исправил некоторые специфичные для Python проблемы, как описано здесь и здесь , но его патч находится в стволе начиная с Python 2.5, поэтому проблемы, которые вы наблюдаете, определенно связаны с системой mallocпакет, а не с Python как таковой.Специфичное для 2.6 объяснение: здесь и здесь .

Поток SO равен здесь , где Хью Аллен в своем ответе цитирует программистов Firefox:До тех пор, пока Mac OS X не является системой, в которой невозможно для процесса, чтобы вернуть память операционной системе.

Таким образом, только завершая процесс, вы можете быть уверены, что освободите его.объем памяти.Например, длительно работающий сервер может время от времени снимать свое состояние на диск и выключаться (с помощью крошечного сторожевого процесса, системного или пользовательского, отслеживая и перезапуская его).Если вы знаете, что следующая операция будет занимать много памяти в течение короткого времени, часто вы можете os.fork, выполнить работу с памятью в дочернем процессе и получить результаты (если таковые имеются), возвращаемые родительскому процессу черезтруба как дочерний процесс завершается.И так далее, и так далее.

0 голосов
/ 23 июня 2010

Насколько велики мы говорим? Сам Python занимает некоторое количество памяти .. до 30 или 40 МБ, я полагаю. Если он больше этого и не собирается, у вас утечка памяти. Только мусор без ссылок может быть собран, так или иначе, ваш дополнительный материал все еще ссылается Сделайте профиль памяти и посмотрите, что происходит.

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