рост Python обрабатывает память со временем

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

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

8
задан herby 22 June 2010 в 21:21
поделиться

2 ответа

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

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

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

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

6
ответ дан 5 December 2019 в 22:16
поделиться

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

0
ответ дан 5 December 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: