2010-06-22 9 views
7

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

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

+0

Почему вы ожидаете, что он спустится? Какую ОС вы используете? Во многих ОС, как только процесс приобрел память, процесс остается таким большим. –

+0

i m используя mac osx 10.5, я верю, что в дальнейшем он будет больше пространства. в настоящее время он вырос примерно на 15 Мбайт больше с 24 МБ на начальном этапе. Я полагаю, что память процесса должна расти с точки зрения MB, которая может повлиять на доступный размер памяти. – herby

ответ

6

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

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

Воздействию SO нить here, где Хью Аллен в своем ответе приводит Firefox программистам удлинять, что Mac OS X представляет собой систему, где это в принципе невозможно для процесса, чтобы дать память обратно в ОС.

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

0

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

+0

в настоящее время он вырос примерно на 15 Мбайт больше с 24 МБ на начальном этапе для минимального сценария. Однако я попробовал инструмент ниже ссылки, из которого я нашел, что указанные данные не более 3 МБ. Я не мог получить оставшийся объем информации о памяти. – herby

+0

Это не так уж и много. Если вы ищете программу с супернизкой памятью, вы обычно не используете код на Python. Большинство ПК имеют 2-4 ГБ оперативной памяти, 15 МБ не стоит беспокоиться. – bwawok

Смежные вопросы