Уведомления

Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Апрель 2, 2007 14:32:05

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка мусора в Python

Кто-нибудь пытался с этим разбираться? Обычно это не нужно, но сейчас работаю с обёрткой над C++ классами (Ogre3D), получается несколько объёмных объектов, которые не очень понятно как удалять. По идее деструктор должен вызываться, если не одна переменная больше на объект не ссылается, но “терзают смутные сомнения”, вдруг там циклические ссылки где-то спрятались. Как я могу проверить, освобождается память или нет?



Офлайн

#2 Апрель 2, 2007 14:44:07

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка мусора в Python

посмотри модуль gc

Этот модуль предоставляет интерфейс к необязательному “сборщику мусора” (garbage
collector, GC): возможность отключить его, настроить частоту работы, установить отла-
дочные параметры, а также предоставляет доступ к “потерянным”1 объектам, найденным
“сборщиком мусора”, которые, однако, не могут быть удалены. Так как “сборщик мусо-
ра” дополняет механизм подсчета ссылок, уже используемый интерпретатором Python,
Вы можете отключить его, если уверены, что программа не создает циклических ссы-
лок. Автоматический сбор может быть отключен вызовом gc.disable(). Для поиска
утечек памяти при отладке, следует вызвать gc.set_debug(gc.DEBUG_LEAK).



Офлайн

#3 Апрель 2, 2007 15:12:04

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка мусора в Python

создаём циклические ссылки

import gc
>>> class A:
pass
>>> a=A()
>>> b=A()
>>> a.d=b
>>> b.d=a
>>> a
<__main__.A instance at 0x012963C8>
>>> b
<__main__.A instance at 0x012963F0>
>>> a.d
<__main__.A instance at 0x012963F0>
>>> b.d
<__main__.A instance at 0x012963C8>
>>> gc.set_debug(gc.DEBUG_LEAK)
>>> del a
>>> del b
>>> gc.collect()
gc: collectable <A instance at 012963C8>
gc: collectable <dict 01290030>
gc: collectable <A instance at 012963F0>
gc: collectable <dict 01290A50>
4
>>> gc.garbage


Как я понимаю, надо добиваться, чтобы подобный код в программе всегда приводил к пустой gc.garbage. Видимо, такую проверку надо будет в программу вставить…



Офлайн

#4 Апрель 3, 2007 13:07:37

ofigetitelno
От:
Зарегистрирован: 2006-08-01
Сообщения: 136
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка мусора в Python

Используйте викрефы, и будет вам счастье :)



Офлайн

#5 Апрель 3, 2007 13:25:58

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка мусора в Python

ofigetitelno
Используйте викрефы, и будет вам счастье :)
а что это такое?



Офлайн

#6 Апрель 3, 2007 13:48:36

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка мусора в Python

Офлайн

#7 Апрель 3, 2007 13:52:08

OlDer
От:
Зарегистрирован: 2006-07-19
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка мусора в Python

pythonwin
а что это такое?
http://docs.python.org/lib/module-weakref.html
Хотел удалить, но не буду - все-таки у меня ссылка правильнее ;-)



Отредактировано (Апрель 3, 2007 13:52:53)

Офлайн

#8 Апрель 3, 2007 13:54:39

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка мусора в Python

slivlen, OlDer спасибо за ссылки :)
тоже хотел запостить - не успел …



Офлайн

#9 Апрель 4, 2007 09:08:13

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка мусора в Python

Спасибо всем! Про Weak Reference не знал раньше, классная штука.



Офлайн

#10 Апрель 4, 2007 15:00:03

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Сборка мусора в Python

кто сталкивался с утечками памяти в sqliobject, - пожалуйста, подскажите как решали проблему



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version