2013-05-03 2 views
6

Я использую последнюю версию установщика 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.

+0

это отступы верный? Вы используете gtk.main_iteration() до тех пор, пока есть события после каждого установленного ярлыка? – pcurry

+0

Да, это правильный способ сделать это. Это в основном превращает основной петлю наизнанку. –

+0

@ Series8217 Что такое цикл for? – jadkik94

ответ

1

Bug (685959) действительно проблема. Исправлена ​​ошибка в gtk + 2.24.14. Однако 2.24.14 не будет компилироваться для win32 (надеюсь, что кто-нибудь, кто читает мой вопрос и ответ, понимает, что GTK уже не является разумным выбором или кросс-платформенной разработкой).

Я применил this patch до версии 2.24.10 и успешно скомпилировал результат. С моими новыми файлами времени работы, похоже, работает.

Я использовал инструкции здесь, чтобы построить GTK на Windows, с MinGW: http://ingar.satgnu.net/devenv/mingw32/gtk.html

32-разрядная сборка будет не в состоянии вокруг GTK-обновление-иконописца кэша, если вы запустите в MSYS обстреливать администратора. Для 64-битной сборки вам нужно rm gtk/gtk.def перед запуском make. Сборка и установка GTK +, выполнив следующие команды:

кд $ LOCALBUILDDIR & & \ Wget -c http://ftp.gnome.org/pub/gnome/sources/gtk+/2.24/gtk+-2.24.10.tar.xz & & \ XZ -d -c GTK + -2.24.10.tar.xz | tar xv & & \ cd gtk + -2.24.10 & & \ ./ Настроить prefix = $ LOCALDESTDIR --with-gdktarget = win32 \ --with-включено-immodules = IME повреждают-отлаживать повреждают-GTK-док & & \ сделать & & \ сделать установку

Я знаю, что это не «обходной путь», как я просил в моем вопросе, но более 6 месяцев без ответа говорит мне, что решения нет, кроме исправления ошибки во время выполнения ...