Russian Qt Forum
Ноябрь 24, 2024, 06:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Утечка памяти.  (Прочитано 2485 раз)
spirits25
Гость
« : Февраль 22, 2012, 14:55 »

Доброе Всем время суток!

Сразу скажу, что использую PySide.
Есть Layout, на котором постоянно удаляется один виджет и создаётся заново с новыми параметрами. Всего на слое 2 виджета
Удаляю разными способами
Код:
            self.widget2.close()
           
            self.layout.removeItem(self.layout.itemAt(1))
            try:
                self.widget2.destroy()
                self.widget2.deleteLater()
                self.widget2 = None
                del (self.widget2)
            except:
                print 'Delete Error!'
Добавляю новый виджет
Код:
self.widget2 = MyWidget(self, name)
self.layout.addWidget(self.widget2)
В классе MyWidget строится большой виджет (много разных элементов в слое)
В ходе примерно 50 выполнений занятая память плавно возрастает с
%MEM  1.8
до
%MEM  2.2
А памяти 4 Гига. Причём дальшейшее выполнение этого кода к такой утечке уже не приводит. Но если то же делать с другим виджетом (тоже класс MyWidget, но от входящих параметров он строит другой виджет) то память в течении первых десятков повторения кода растёт от %MEM 2.2 и плавно доходит до %MEM  2.6 (или 2.7, не столь важно) и опять дальше практически не растёт.
 
В классе MyWidget следующий код (удаление всех виджетов в слое у widget2) результата так же не даёт
Код:
        for i in range (self.grid.count()):
            w = self.grid.itemAt(i)
            if hasattr (w, 'widget'):
                if hasattr (w.widget(), 'close'):
                    w.widget().close()
                widg = w.widget()
                del widg
            del w

Подскажите, что можно сделать и почему так?
Спасибо.
Записан
spirits25
Гость
« Ответ #1 : Февраль 22, 2012, 16:30 »

Сделал ещё тест. В цикле запускаю 200 раз создание открытие и закрытие виджета - память с 1.6 до 2.8.
повторяю 200 раз - память с 2.8 до 2.9. То есть первый раз сильно, а потом гораздо меньше.

Если сначала 10 циклов по 20 раз (создание открытие и закрытие виджета) - память в первом цикле с 1.6 до 1.7, потом держится 1.7. Почему первый раз память теряется?
Записан
spirits25
Гость
« Ответ #2 : Февраль 24, 2012, 12:05 »

Может хоть в таком кто-нибудь подскажет?
почему процесс начинает кушать всё больше и больше памяти???
Код:
from PySide import QtGui, QtCore
import datetime, sys
import gc

class MyWgt(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)

        self.ld = []
        for i in range (20):
   self.ld.append(QtGui.QLabel(self))
   
for i in self.ld:
   i.deleteLater()
del self.ld

        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)


app = QtGui.QApplication(sys.argv)

gc.enable()
for i in range (1000):
    print i
    ex = MyWgt()
    ex.show()
    ex.close()

    # как его удалить??????
    ex.destroy()
    del ex
    
    if i % 10 == 0:
gc.collect()


i = 0
while (True):
    if i < 100000:
i += 1
    else:
i = 0

sys.exit(1)

Причём если не делать show для виджета, то память не уходит. Почему мусорщик не хочет очищать память, если виджет был показан? или как заставить его убрать этот мусор?
« Последнее редактирование: Февраль 24, 2012, 12:31 от spirits25 » Записан
mutineer
Гость
« Ответ #3 : Февраль 24, 2012, 13:30 »

мне кажется, что на форуме по питону тебе помогут быстрее и лучше
Записан
spirits25
Гость
« Ответ #4 : Февраль 24, 2012, 13:50 »

мне кажется, что на форуме по питону тебе помогут быстрее и лучше
Как то привык тут=) но спасибо за совет, спрошу ещё где-нибудь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.12 секунд. Запросов: 21.