Как освободить память из словаря словарей?
Рассмотрим словарь словарей:
bigDict = { 'user1': userDict1, 'user2': userDict2 }
Скажем, в нем содержатся миллионы пользователей, и я хочу освободить память после того, как я закончу обработку всего этого.
Будет ли достаточно следующего:
del bigDict
Или мне нужно сделать что-то вроде:
for userId, userDict in bigDict.iteritems():
del userDict
1 ответ
Если единственная ссылка на ваши словари находится в bigDict
, просто удалив его, вызовет сборщик мусора. Если были ссылки снаружи, удаление каждого из них с помощью вашего цикла ничего не сделает, потому что del
просто означает "уменьшить в один счетчик ссылок", и если и только если счетчик достигнет нуля, объект будет удален.
Самый простой способ убедиться, что ваш объект освобожден, - это создать и использовать его в закрытии, когда это возможно. Итак, у вас есть функция, которая внутри тела создает большой словарь, обрабатывает его и, как только это будет сделано, возвращает набор значений. Таким образом, вы уверены, что нет никаких случайных ссылок. Конечно, в большинстве практических целей это невозможно.
Следует отметить, что если у вас одновременно много живых объектов, их память не будет возвращена ОС, а будет сохранена как пул для новых объектов. (Это поведение было частично улучшено в Python 3). Если управление памятью имеет решающее значение, вы можете использовать объекты массива, чтобы они больше не были маленькими объектами (и сохраняли некоторые издержки в процессе).