Управление виртуальной памятью в Python (2.6-2.7) - будет ли оно повторно использовать выделенную память для любого типа данных? - PullRequest
1 голос
/ 12 января 2012

У меня вопрос по поводу виртуальной памяти в Python.

Когда процесс потребляет относительно большой объем памяти, он не «освобождает» неиспользуемую память. Например, после создания огромного списка строк, скажем, этот список использует 30 МБ памяти, поэтому весь процесс занимает примерно 40 МБ, при удалении списка процесс все равно потребляет 40 МБ, но если другой список с тем же объемом данных Если процесс создан, процесс не займет больше памяти, поскольку он будет использовать виртуальную память, которая доступна, но не освобождена для ОС.

Мой вопрос: какие данные будут повторно использовать эту нераспущенную виртуальную память? Я имею в виду, что 30 МБ были «взяты» из ОС, когда я создал список строк, и даже когда я его удаляю, следующий список строк не будет занимать больше памяти у ОС, если он умещается в 30 МБ. Но если вместо этого создается список строк, другой тип данных, например QPixmap (из Qt, использующий PyQt), будет ли он использовать эти 30 МБ, изначально выделенные списком строк?

Заранее спасибо.

Редактировать: Ну, этот вопрос звучит лениво. Я знаю, что мог бы просто проверить этот конкретный случай, но я хочу знать, теоретически, я не хочу ответа для этого конкретного случая "списка строк и qpixmap", но в целом.

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Проблема «освобождения» памяти состоит из двух частей: во-первых, получение Python для сбора мусора объектов, и, во-вторых, возвращение неиспользуемой памяти в ОС на уровне C.

Если у вас есть проблемы с неограниченным ростом размера процесса, вы почти наверняка не разрешаете собирать мусор.99,9% времени (до 0 значащих цифр :)), если вы пытаетесь угадать управление памятью на уровне C в Python, вы попадаете в дыру.

Помните, что в Python ваши объекты даже не являются кандидатами на сборку мусора, пока не останется живых объектов со ссылками на них.Вы можете очень легко спрятать ссылку на объект где-нибудь, не осознавая этого.

Существует инструмент Python под названием Dowser , который очень полезен при поиске утечек памяти, вызванных хранением ссылок на объекты.Если вы видите, что количество объектов для определенного класса растет со временем без границ ... есть проблема с памятью.

Удачи!

0 голосов
/ 12 января 2012

На уровне C (реализация CPython) все, что выделено в куче с malloc(), будет потреблять память, и эта память не будет освобождена ОС, когда эта память освобождается с помощью free().Он будет возвращен только после смерти.Но когда новым блокам присваивается malloc(), они будут использовать освобожденную память.

(Если только свободная память не сильно фрагментирована и в свободных зонах недостаточно свободного места для размещения свободных зон)новые распределения. Но давайте не будем беспокоиться об этом патологическом случае.)

Каждый объект Python реализован CPython как один или несколько блоков памяти, выделенных с помощью malloc(), поэтому ответ на ваш вопрос: практически любой кусокданных Python может повторно использовать пространство, освободившееся в результате освобождения некоторых других данных Python.

...