如何防止wxPython子类中的内存泄漏?
我正在运行Python2.7、Wxpython2.8.12.1和Windows7 我正在开发一个程序,它将大数据对象传递给wx.Frame并创建交互式绘图。目标是迭代许多数据对象,为每个数据对象创建新窗口和绘图 我遇到的问题是,随着wx.Frame子类的每个新实例的出现,内存使用量都会急剧增加 下面的代码重现了我的问题 第一个循环创建10个对象,每个对象包含一个大小逐渐减小的数组。当这个循环运行时,内存使用量(根据Windows任务管理器)会随着每次迭代而下降 第二个循环创建10个wx.Frame对象,这些对象包含相同的数组。但是,现在内存使用量稳步增加到1GB如何防止wxPython子类中的内存泄漏?,python,memory-leaks,wxpython,weak-references,Python,Memory Leaks,Wxpython,Weak References,我正在运行Python2.7、Wxpython2.8.12.1和Windows7 我正在开发一个程序,它将大数据对象传递给wx.Frame并创建交互式绘图。目标是迭代许多数据对象,为每个数据对象创建新窗口和绘图 我遇到的问题是,随着wx.Frame子类的每个新实例的出现,内存使用量都会急剧增加 下面的代码重现了我的问题 第一个循环创建10个对象,每个对象包含一个大小逐渐减小的数组。当这个循环运行时,内存使用量(根据Windows任务管理器)会随着每次迭代而下降 第二个循环创建10个wx.Fram
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()
我可以通过两种方法阻止内存泄漏:
1) 通过使变量“x”成为局部变量(即删除“self”):
2) 使用弱引用:
self.x = weakref.ref(np.arange(0, i*5000000))
我不能使用方法#1,因为我需要为整个类提供大型数据对象。我对weakref对象知之甚少,但到目前为止,我还没有使用对我的数据对象的弱引用(总是出现“weakref对象没有属性”错误)。似乎可以将
x
设置为类属性
class wxWindow(wx.Frame):
x = np.arange(0, i*5000000)
def __init__(self, i=None):
super(wxWindow, self).__init__(None)
另一种方法是显式地del
x
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()
将代码的最后一部分更改为:
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()
App作为单例(read)运行,所以每个进程只需要1个wx.App实例。你做了10个。无论如何,这将治愈你的记忆问题。完美!几个星期以来,我一直在努力解决这个问题。谢谢。让我补充一下你提问的方式。包括实际运行以解释问题的代码可以使理解和提出解决方案更加容易。
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()