утечка памяти в python при использовании wxPython - PullRequest
0 голосов
/ 03 апреля 2012

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

Часть, которая вызывает утечку памяти, фактически создает новый wx.Panel и добавляет его в интерфейс, используя wx.WindowSplitter, а затем удаляет панель и разбивает окно.

self.getAction(self, event):
    if self.lastEdit[0] != None:
        if self.lastEdit[4] == STATEMENT:
            dialog = EditStatement(self.API.editorSplitter,
                    self.API, self.lastEdit, self.statementUpdateClbk)
        elif self.lastEdit[4] == CONDITION:
            dialog = EditCondition(self.API.editorSplitter,
                    self.API, self.lastEdit, self.conditionUpdateClbk)
    # Show or hide split window
    self.splitEditor(dialog)

def splitEditor(self, editPanel):
    self.API.editorSplitter.Unsplit()
    if self.lastPanel != None:
        self.lastPanel.DissociateHandle()
        self.lastPanel.DestroyChildren()
        self.lastPanel.Destroy()
    self.lastPanel = editPanel
    if editPanel != None:
        self.API.editorSplitter.SplitVertically(self.API.tabManager,  
                                           editPanel, -305)

Обратите внимание, что EditStatement un EditCondition - это wx.Panel предложения, упомянутые ранее. Вызов getAction() в цикле случайным образом увеличивает использование памяти, и самое странное то, что на некоторых итерациях изменений нет, на некоторых итерациях используемая память даже падает, но на большинстве итераций используемая память увеличивается. Вот некоторые выходные данные отладки, сделанные с использованием модуля оболочки gc.

Используемый код для проверки:

def cycler(self):
    while True:
        self.getAction(None) #Show window
        wx.YieldIfNeeded()
        self.mem() # prints memory information
        self.splitEditor(None) #Hide window
        wx.YieldIfNeeded()
        self.mem() # prints memory information             

Вывод выглядит следующим образом:

Window action -  Action      Object          Count

Create Window -  Added    StaticText  10
Create Window -  Changed  dict    +1
Create Window -  Added    GridBagSizer    1
Create Window -  Changed  list    +2
Create Window -  Added    CheckBox    4
Create Window -  Changed  ComboBox    +6
Create Window -  Added    EditStatement   1
Create Window -  Changed  BoxSizer    +1
Create Window -  Changed  instancemethod  +15

Create Window -  Count = 25453
Create Window -  Memory(rss): 42528

Destroy Window -  Changed dict    -1
Destroy Window -  Changed list    -2
Destroy Window -  Changed ComboBox    -6
Destroy Window -  Changed BoxSizer    -1
Destroy Window -  Changed instancemethod  -15
Destroy Window -  Deleted StaticText  10
Destroy Window -  Deleted GridBagSizer    1
Destroy Window -  Deleted CheckBox    4
Destroy Window -  Deleted EditStatement   1

Destroy Window -  Count = 25412
Destroy Window -  Memory(rss): 42528

Create Window -  Added    StaticText  10
Create Window -  Changed  dict    +1
Create Window -  Added    GridBagSizer    1
Create Window -  Changed  list    +2
Create Window -  Added    CheckBox    4
Create Window -  Changed  ComboBox    +6
Create Window -  Added    EditStatement   1
Create Window -  Changed  BoxSizer    +1
Create Window -  Changed  instancemethod  +15

Create Window -  Count = 25453
Create Window -  Memory(rss): 42536

Destroy Window -  Changed dict    -1
Destroy Window -  Changed list    -2
Destroy Window -  Changed ComboBox    -6
Destroy Window -  Changed BoxSizer    -1
Destroy Window -  Changed instancemethod  -15
Destroy Window -  Deleted StaticText  10
Destroy Window -  Deleted GridBagSizer    1
Destroy Window -  Deleted CheckBox    4
Destroy Window -  Deleted EditStatement   1

Destroy Window -  Count = 25412
Destroy Window -  Memory(rss): 42540

Create Window -  Added    StaticText  10
Create Window -  Changed  dict    +1
Create Window -  Added    GridBagSizer    1
Create Window -  Changed  list    +2
Create Window -  Added    CheckBox    4
Create Window -  Changed  ComboBox    +6
Create Window -  Added    EditStatement   1
Create Window -  Changed  BoxSizer    +1
Create Window -  Changed  instancemethod  +15

Create Window -  Count = 25453
Create Window -  Memory(rss): 42552

Destroy Window -  Changed dict    -1
Destroy Window -  Changed list    -2
Destroy Window -  Changed ComboBox    -6
Destroy Window -  Changed BoxSizer    -1
Destroy Window -  Changed instancemethod  -15
Destroy Window -  Deleted StaticText  10
Destroy Window -  Deleted GridBagSizer    1
Destroy Window -  Deleted CheckBox    4
Destroy Window -  Deleted EditStatement   1

Destroy Window -  Count = 25412
Destroy Window -  Memory(rss): 42556

Create Window -  Added    StaticText  10
Create Window -  Changed  dict    +1
Create Window -  Added    GridBagSizer    1
Create Window -  Changed  list    +2
Create Window -  Added    CheckBox    4
Create Window -  Changed  ComboBox    +6
Create Window -  Added    EditStatement   1
Create Window -  Changed  BoxSizer    +1
Create Window -  Changed  instancemethod  +15

Create Window -  Count = 25453
Create Window -  Memory(rss): 42576

Как видите, используемая память увеличивается, но количество объектов не меняется после создания и удаления, я просто не понимаю, что может создать такую ​​утечку памяти. Любые идеи были бы хорошы. За 45 минут использование памяти выросло с ~ 20 MB до ~ 500 MB.

P.S. Если кому-то интересно, исходный код созданных панелей можно найти по адресу: EditStatement EditCondition

P.S.S. Я не уверен, но я склонен думать, что это ошибка wx.Python, что-то с wx.SplitterWindow

...