Python восстанавливает память после удаления элементов в словаре - PullRequest
11 голосов
/ 14 октября 2010

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

Простой пример этого:

>>> tupdict = {}
# consumes around 2 GB of memory
>>> for i in xrange(12500000):
...   tupdict[i] = (i,i)
... 
# delete over half the entries, no drop in consumed memory
>>> for i in xrange(7500000):
...   del tupdict[i]
... 
>>> import gc
# manually garbage collect, still no drop in consumed memory after this
>>> gc.collect()
0
>>> 

Я представляю, что происходит то, что хотя записи удаляются и запускается сборщик мусора, Python не меняет размер словаря. У меня вопрос, есть ли какой-нибудь простой способ обойти это, или мне, вероятно, потребуется более серьезное переосмысление того, как я пишу свою программу?

Ответы [ 2 ]

18 голосов
/ 14 октября 2010

Множество факторов влияют на то, возвращает ли Python эту память в базовую ОС или нет, вероятно, именно так вы пытаетесь определить, освобождается ли память. CPython имеет систему распределенных пулов, которая имеет тенденцию удерживать свободную память, чтобы ее можно было эффективно использовать повторно (но эти последующие выделения не увеличат ваш объем памяти с точки зрения ОС), что может быть тем, что вы Смотрю.

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

В конце концов, управление освобождаемой памятью процесса входит в компетенцию операционной системы, и используются различные схемы (с достоинствами и недостатками), так что просто просмотр выбранного вами средства информации о системе не обязательно скажет вам вся правда.

6 голосов
/ 06 декабря 2013

Вы правы, что Python не изменяет размер словаря обратно, если элементы удалены из словаря. Это не имеет ничего общего с управлением памятью ОС и сборкой мусора, это деталь реализации структуры данных Python dict.

Обходной путь - создать новый словарь, скопировав старый словарь. Проверьте это отличное видео для получения дополнительной информации: http://pyvideo.org/video/276/the-mighty-dictionary-55 (около 26:30 есть ответ).

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