Как освободить память из словаря словарей?

Рассмотрим словарь словарей:

bigDict = { 'user1': userDict1, 'user2': userDict2 } 

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

Будет ли достаточно следующего:

del bigDict

Или мне нужно сделать что-то вроде:

for userId, userDict in bigDict.iteritems():
    del userDict

1 ответ

Решение

Если единственная ссылка на ваши словари находится в bigDict, просто удалив его, вызовет сборщик мусора. Если были ссылки снаружи, удаление каждого из них с помощью вашего цикла ничего не сделает, потому что del просто означает "уменьшить в один счетчик ссылок", и если и только если счетчик достигнет нуля, объект будет удален.

Самый простой способ убедиться, что ваш объект освобожден, - это создать и использовать его в закрытии, когда это возможно. Итак, у вас есть функция, которая внутри тела создает большой словарь, обрабатывает его и, как только это будет сделано, возвращает набор значений. Таким образом, вы уверены, что нет никаких случайных ссылок. Конечно, в большинстве практических целей это невозможно.

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

Другие вопросы по тегам