2013-08-13 3 views
3

У меня есть программа, и в ней она создает вкладки, и каждый раз, когда я ее создаю, использование памяти увеличивается, но когда я закрываю вкладку, память не опускается. Мне просто интересно, это нормально, и есть ли что-то, что я могу с этим поделать? Вот мой код для закрытия вкладок:pyqt: Использование памяти

def removeTab(self, index): 

    text[index].deleteLater() 
    del text[index] # text box 

    # reorganize dict 
    last = -1 
    for key in sorted(text): 
    if last+1 != key: 
     text[key-1] = text[key] 
     del text[key] 
    last += 1 

    self.tab_widget.setCurrentIndex(index) 
    widget = self.tab_widget.currentWidget() 
    self.tab_widget.removeTab(index) # remove tab 
    widget.deleteLater() 
    del widget 
+0

Я разместил это в Google Plus, потому что мне хотелось бы, чтобы это ответили. –

+0

Это звучит так, как будто это связано с сборкой мусора; Http: //en.wikipedia.org/wiki/Garbage_collection_% 28computer_science% 29 – RobinJ

ответ

0

Хорошо, кто-то из Google Plus дал предложение.

Кевин Кеннеди (https://plus.google.com/u/0/105980580368438890195/posts) предложения

".close() перед .deleteLater()".

+0

Это исправлено для вас? Я не понимаю, почему. Кажется излишним с deleteLater(). – jdi

+0

@jdi Я не ОП. Я поделился этим вопросом с Google Plus, потому что я хотел найти ответ OP. Я не знаю PyQT достаточно хорошо, чтобы предоставить OP ответ самостоятельно. –

0

В общем случае память, выделенная malloc или new, не возвращается в систему при освобождении/удалении. Вместо этого он сохраняется приложением и повторно используется для последующих распределений. Если вам нужно вернуть память, вы должны посмотреть на использование специального распределителя.

0

Вы используете python. «Del» удаляет только ссылку на объект, он не освобождает память. Это сборщик мусора, который отвечает за освобождение памяти (и afaik, вы не можете контролировать это).

То же самое произойдет, если вы сохраните ссылку на объект где-то еще.

2

Грубо говоря:

  1. объем памяти, доступной для питона приложения могут расти в течение своей жизни, но он никогда не сможет полностью сжиматься, где он начал.

  2. Невозможно заставить python освободить неиспользуемую память обратно в систему.

Так что лучшее, что вы можете сделать, это попытаться управлять количеством, с помощью которого память растет. Один очевидный способ сделать это - удалить ненужные объекты, чтобы вновь созданные объекты могли повторно использовать память, которая уже выделена.

Но что делать, если приложение кажется неспособным для повторного использования памяти? Это означает, что объекты не удаляются чисто (т. Е. Есть ссылки на них, которые хранятся где-то), или, что гораздо менее вероятно, что в PyQt/Qt имеется утечка памяти.

Отслеживание дополнительных ссылок, хранящихся на объектах, может иногда быть довольно сложным (по меньшей мере). Некоторые общие «тайники» в PyQt являются сигналами, связанными с использованием lambda (или functools.partial) или защищенных от обезьян методов. Но для их поиска нет жестких правил.

Как представляется, код примера в вопросе, похоже, не имеет мест, где дополнительные ссылки могут быть «скрыты». Поэтому, если использование памяти растет «каждый раз», создается вкладка (как утверждает OP), тогда проблемы должны находиться в другом месте приложения, или, если быть более точным, проблемы, вероятно, связаны с тем, как создаются объекты , а не в том, как они удаляются.

+1

Я потратил довольно много отладки на мою проблему с утечкой памяти. После того, как я удалил лямбду и частично в глубоко вложенные виджеты, проблема исчезла. –