Skip to main content
 首页 » 编程设计

python之如何防止 wxPython 子类中的内存泄漏

2025年05月04日7lvdongjie

我正在运行 Python 2.7、wxPython 2.8.12.1 和 Windows 7。

我正在开发一个将大型数据对象传递给 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() 

我可以通过两种方法阻止内存泄漏:

1) 通过使变量“x”成为本地变量(即删除“self.”):

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

2) 使用弱引用:

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

我不能使用方法 #1,因为我需要整个类(class)都可以使用大型数据对象。我对 weakref 对象知之甚少,但到目前为止,我还没有对我的数据对象使用弱引用(总是得到“weakref 对象没有属性”错误)。

请您参考如下方法:

将代码的最后一部分更改为:

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 个。不管怎样,这会解决你的内存问题。