我正在運行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」錯誤)。
完美!我幾個星期以來一直在努力解決這個問題。謝謝。 – 2013-04-30 00:37:10
讓我在你問這個問題的方式上補充你。包括實際運行來解釋問題的代碼使得它更容易理解,並提出解決方案。 – MikeHunter 2013-04-30 00:41:27