2013-04-29 57 views
2

我正在運行Python 2.7,wxPython 2.8.12.1和Windows 7.如何防止wxPython子類中的內存泄漏?

我正在研究一個將大數據對象傳遞給wx.Frame並創建交互式圖的程序。目標是遍歷許多數據對象,爲每個數據對象創建新的窗口和圖表。

我遇到的問題是,我的wx.Frame子類的每個新實例都會顯着增加內存使用量。

下面的代碼重新創建我的問題。

第一個循環創建10個對象,每個對象包含一個遞減大小的數組。在此循環運行時,內存使用情況(根據Windows任務管理器)會隨着每次迭代而下降。

第二個循環創建了10個包含相同數組的wx.Frame對象。但是,現在內存使用量穩步增加至1 GB。

import numpy as np 
import time 
import wx 


class MyClass(): 

    def __init__(self, i): 
     self.x = np.arange(0, i*5000000) 


#While this loop runs, memory usage decreases 
for i in [10,9,8,7,6,5,4,3,2,1]: 
    print(i) 
    m = MyClass(i) 
    time.sleep(2) 


class wxWindow(wx.Frame): 

    def __init__(self,i = None): 
     super(wxWindow,self).__init__(None) 
     self.x = np.arange(0, i*5000000) 


#While this loop runs, memory usage increases 
#until the program crashes. 
for i in [10,9,8,7,6,5,4,3,2,1]: 
    print(i) 
    app = wx.App() 
    app.frame = wxWindow(i) 
    app.frame.Show(True) 
    app.MainLoop() 
    app.Destroy() 

我可以通過2種方法停止存儲器泄漏:

1)通過使變量 「x」 本地(即丟棄) 「自」:

x = np.arange(0, i*5000000) 

2)使用弱參考:

self.x = weakref.ref(np.arange(0, i*5000000)) 

我不能使用方法#1,因爲我需要大數據對象可用於整個c姑娘。我對weakref對象瞭解不多,但到目前爲止,我還沒有使用對數據對象的弱引用獲得任何運氣(總是得到一個「weakref object has no attributes」錯誤)。

回答

0

好像你可以做x類屬性

class wxWindow(wx.Frame): 
    x = np.arange(0, i*5000000) 
    def __init__(self, i=None): 
     super(wxWindow, self).__init__(None) 

另一種方式是明確delx

del app.frame.x 

終於出現,可能ŞwxWindow的的方法,可以處理清理。例如

class wxWindow(wx.Frame): 

    def __init__(self,i=None): 
     super(wxWindow, self).__init__(None) 
     self.x = np.arange(0, i*5000000) 

    def close(self): # you'll have to find the correct name in the docs 
     del self.x 
     super(wxWindow, self).close() 
1

更改代碼的最後一部分,以這樣的:

app = wx.App() 
for i in [10,9,8,7,6,5,4,3,2,1]: 
    print(i) 
    frame = wxWindow(i) 
    frame.Show(True) 
    app.MainLoop() 

wx.App作爲一個單獨操作(讀this thread),所以你只需要每處理1個wx.App實例。你在製作10個。無論如何,這會治好你的記憶問題。

+0

完美!我幾個星期以來一直在努力解決這個問題。謝謝。 – 2013-04-30 00:37:10

+0

讓我在你問這個問題的方式上補充你。包括實際運行來解釋問題的代碼使得它更容易理解,並提出解決方案。 – MikeHunter 2013-04-30 00:41:27