2013-04-29 27 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

相关问题