2

我正在运行 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,因为我需要整个班级都可以使用大数据对象。我对弱引用对象一无所知,但到目前为止,我还没有运气使用对我的数据对象的弱引用(总是得到一个“弱引用对象没有属性”错误)。

4

2 回答 2

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 作为单例运行(阅读此线程),因此每个进程只需要 1 个 wx.App 实例。你做了10个。无论如何,这将治愈你的记忆问题。

于 2013-04-30T00:08:13.950 回答
0

好像你可以做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()
于 2013-04-29T23:14:48.800 回答