сайтов - парсинг таблицы с сайта python




Сбор мусора Python (5)

weakref может использоваться для структурированного кода кругового объекта, как в объясненном примере

Я создал некоторый код python, который создает объект в цикле, и на каждой итерации он перезаписывает этот объект новым одним и тем же типом. Это делается 10 000 раз, а Python занимает 7 МБ памяти каждую секунду, пока не будет использована моя 3-гигабайтная ОЗУ. Кто-нибудь знает, как удалить объекты из памяти?


Вот что вы можете сделать в REPL, чтобы заставить разыменовать переменную:

>>> x = 5
>>> x
5
>>> del x
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

Если вы создаете циклические ссылки, ваши объекты не будут немедленно освобождены, но придется ждать выполнения цикла GC.

Вы можете использовать модуль weakref для решения этой проблемы или явно использовать свои объекты после использования.


Это старая ошибка, которая была исправлена ​​для некоторых типов в python 2.5. Случилось то, что python не был так хорош в сборе таких вещей, как пустые списки / словари / tupes / floats / ints. В python 2.5 это было исправлено ... в основном. Однако float и ints являются синглтонами для сравнений, поэтому, когда один из них создается, он остается вокруг до тех пор, пока интерпретатор жив. Я был укушен этим худшим, имея дело с большим количеством поплавков, так как у них неприятная привычка быть уникальной. Это было охарактеризовано для python 2.4 и обновлено о том, что он складывается в python 2.5

Лучший способ, которым я нашел это, - перейти на python 2.5 или новее, чтобы заботиться о проблемах с списками / словарями / кортежами. Для чисел единственным решением является не допускать попадания больших чисел чисел в питон. Я сделал это с моей собственной оболочкой для объекта c ++, но у меня сложилось впечатление, что numpy.array даст похожие результаты.

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


Я обнаружил, что в моем случае (с Python 2.5.1) с круговыми ссылками, включающими классы с __del__() , не только сбор мусора не происходил своевременно, __del__() моих объектов никогда не вызывались , даже когда скрипт вышел. Поэтому я использовал weakref для разрыва круговых ссылок, и все было хорошо.

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





garbage-collection