Форум сайта python.su
Всем привет.
почему процесс начинает кушать всё больше и больше памяти??? На моей машине потребление памяти плавно поднимается с 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)
Офлайн
Не знаю есть ли смысл все рассказывать, но я попробую:)
Во-первых. В питоне автоматическая сборка мусора. АВТОМАТИЧЕСКАЯ СБОРКА МУСОРА!!!
И ваши строчки типа
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
gc.enable()
ex.destroy()
del ex
gc.collect()
Чистейший бред.
Во-вторых последили бы за форматированием в блоке кода, для питона это критически важно, да и читать невозможно.
Теперь по существу:)
Вы знаете что делает функция deleteLater() ?
Она говорит, что объект будет удален, когда управление будет возвращено в event loop. Это главный цикл любого гуи приложения, через который передаются все события. Если event loop не запущен, то объект будет удален после его запуска. И как же он запускается? Да вот так: sys.exit(app.exec_()) (эта строчка есть в ЛЮБОМ ПРИМЕРЕ PyQt, уж потрудились бы посмотреть).
Так и хочется сказать: не знаешь, не трогай! Маленький еще.
Офлайн
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_())
Отредактировано (Фев. 24, 2012 14:30:21)
Офлайн
Оп! Как интересно…. У вас какая система? Версия питона/PySide? Тут придется глубже копать. Вообще пример достаточно нестандартный (с трудом представляю, чтобы кому-нибудь в программе придется создавать 1000 окон:)) У меня сейчас под рукой нет PySide, так что начну копать в ближайшие пару дней.
Офлайн
Меня больше интересует, а с чего вообще наш многоуважаемый автор взял, что в его последнем примере память должна автоматически освобождаться до END. Прежде чем писать громкие посты “Ололо, я нашел утечку” надо бы разобраться с матчастью. Виджеты создаются в цикле как дочерние виджеты par. Исходя из этого очевидно, что все объекты будут существовать до тех пор пока жив родитель. А родитель собственно жив в данном примере до выхода из программы. Занавес.
Офлайн