Найти - Пользователи
Полная версия: Утечка памяти
Начало » GUI » Утечка памяти
1
spirits25
Всем привет.
почему процесс начинает кушать всё больше и больше памяти??? На моей машине потребление памяти плавно поднимается с 0.8% до 1.2%.
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 (10000):
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 для виджета, то память не уходит. Почему мусорщик не хочет очищать память, если виджет был показан? или как заставить его убрать этот мусор?
Спасибо.
dartNNN
Не знаю есть ли смысл все рассказывать, но я попробую:)
Во-первых. В питоне автоматическая сборка мусора. АВТОМАТИЧЕСКАЯ СБОРКА МУСОРА!!!
И ваши строчки типа
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
gc.enable()
ex.destroy()
del ex
gc.collect()
Чистейший бред.
Во-вторых последили бы за форматированием в блоке кода, для питона это критически важно, да и читать невозможно.
Теперь по существу:)
Вы знаете что делает функция deleteLater() ?
Она говорит, что объект будет удален, когда управление будет возвращено в event loop. Это главный цикл любого гуи приложения, через который передаются все события. Если event loop не запущен, то объект будет удален после его запуска. И как же он запускается? Да вот так: sys.exit(app.exec_()) (эта строчка есть в ЛЮБОМ ПРИМЕРЕ PyQt, уж потрудились бы посмотреть).
Так и хочется сказать: не знаешь, не трогай! Маленький еще.
spirits25
dartNNN
Да вот так: sys.exit(app.exec_()) (эта строчка есть в ЛЮБОМ ПРИМЕРЕ PyQt, уж потрудились бы посмотреть).
И у меня это сначало было, но результат тот же.

Без этих строк:
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
gc.enable()
ex.destroy()
del ex
gc.collect()
результат тот же, память растёт.

А ваша
dartNNN
АВТОМАТИЧЕСКАЯ СБОРКА МУСОРА!!!
почему то не срабатывает, когда после кучи программа доходит до строчки
sys.exit(app.exec_())
Вот первоначальный код, в котором дела ещё хуже, чем в первом:
from PySide import QtGui, QtCore
import sys

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

for i in range (40):
self.t = QtGui.QLabel('', self)

app = QtGui.QApplication(sys.argv)

par = QtGui.QWidget()
for i in range (1000):
s = MyWgt(par)
s.show()
s.close()

print "END"
sys.exit(app.exec_())
За эти 1000 итераций память возростает с 0.7% до 8.1%, с каждой итерацией всё более подтупливая.
Так в чём причина??
dartNNN
Оп! Как интересно…. У вас какая система? Версия питона/PySide? Тут придется глубже копать. Вообще пример достаточно нестандартный (с трудом представляю, чтобы кому-нибудь в программе придется создавать 1000 окон:)) У меня сейчас под рукой нет PySide, так что начну копать в ближайшие пару дней.
cutwater
Меня больше интересует, а с чего вообще наш многоуважаемый автор взял, что в его последнем примере память должна автоматически освобождаться до END. Прежде чем писать громкие посты “Ололо, я нашел утечку” надо бы разобраться с матчастью. Виджеты создаются в цикле как дочерние виджеты par. Исходя из этого очевидно, что все объекты будут существовать до тех пор пока жив родитель. А родитель собственно жив в данном примере до выхода из программы. Занавес.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB