Я использую последнюю версию установщика PyGTK All-in-One (2.24.2) для Python 2.7, которая включает в себя Cairo 1.10.8, Pango 1.29.4 , PyGTK 2.24.0 и PyGobject 2.28.3 (я думаю).Работа с большой утечкой памяти в GTK при перерисовке метки
следующие утечки кода ~ 55 Мб памяти:
import gtk
window = gtk.Window()
label = gtk.Label()
window.add(label)
window.show_all()
for _ in range(100000):
label.set_markup('Leaking memory!')
while gtk.events_pending():
gtk.main_iteration()
Примечание: цикл в тестовом сценарии просто так что я мог видеть увеличение потребления памяти в диспетчере задач. Это также существенно то, что происходит в моем реальном приложении, за исключением того, что текст ярлыка изменяется не реже одного раза в секунду, а не просто перерисовывается с одним и тем же текстом каждый раз.
Проблемная линия label.set_markup()
, которая протекает около 0,5 кБ за звонок, поэтому я подозреваю, что проблема находится в GTK или Каире где-то. Возможно, this bug (685959), как отметил комментатор.
Я попытался использовать objgraph, чтобы увидеть, появляются ли какие-либо дополнительные объекты Python пропорционально количеству вызовов gtk.Label.set_markup()
, но нет лишних объектов. Из этого следует, что призывы к gc.collect()
не помогают, и я попытался это сделать. Python, похоже, не знает об объектах, которые отвечают за потребление памяти.
Как найти эту утечку памяти и/или обойти ее? Мне нужно использовать разметку для стилизации некоторого текста для этого приложения, но я попытался использовать gtk.Label.set_text()
в качестве обходного пути, и он также утечки памяти.
Следует отметить, что это приложение предназначено для Windows, поэтому использование PyGObject для получения GTK 3 не является опцией - introspection GObject - еще недоступен в Windows.
это отступы верный? Вы используете gtk.main_iteration() до тех пор, пока есть события после каждого установленного ярлыка? – pcurry
Да, это правильный способ сделать это. Это в основном превращает основной петлю наизнанку. –
@ Series8217 Что такое цикл for? – jadkik94