GtkTreeView树库内存分配

时间:2012-02-16 19:14:29

标签: python memory-management pygtk gtktreeview

我有一个自定义gtk.treeview包装器类来管理自己的列表库。该类有自己的方法来清除liststore的数据并用新数据覆盖它。为了测试内存消耗,树视图只显示8列中的50,000行整数。

我注意到每次调用我的函数用数据更新liststore似乎都会增加应用程序使用的内存,并且在数据被清除后它永远不会回落。

这是我的简单树视图实现:

class TreeViewPrototype(gtk.TreeView):
    def __init__(self):
        gtk.TreeView.__init__(self)

        self.columns = [str, str, str, str, str, str, str, str]
        # Initialize Treeview  and TreeViewColumns here
        # Setup columns
        self.liststore = gtk.ListStore(*self.columns)
        self.set_model(self.liststore)

    def set_list_model(self):
        self.liststore.clear()
        self.liststore = gtk.ListStore(*self.columns)
        # Populate liststore with dummy data
        for i in range(50000):
            row = []
            for j in range(len(self.columns)):
                row.append("%d[%d]"%(i,j))
            self.liststore.append(row)

在我看来,每次调用set_list_model时,当我用新的覆盖列表库时,它从不取消分配数据的内存。我做错了什么?

1 个答案:

答案 0 :(得分:3)

问题似乎在于对liststore中的引用的引用 树视图。因为树视图是一个存在的容器 在整个应用程序的生命周期中,旧的liststore 挂起,仍然被treeview的构造函数引用。如果 每次都会创建一个新的列表库,并且不会引用任何引用 树视图,这个问题似乎消失了。

我的解决方案:

class TreeViewPrototype( gtk.TreeView ):
   def __init__(self):
       gtk.TreeView.__init__(self)
       self.columns = [str,str,str,str,str,str,str,str]
       #TreeView Initialization

   def set_list_model( self ):
       self.set_model(None)
       liststore = gtk.ListStore( *self.columns)
       for i in range( 50000 ):
           row = []
           for j in range( len( self.columns)):
               row.append( "%d[%d]"%(i,j))
           liststore.append( row )
       self.set_model( liststore )

使用set_model(None)似乎正确地取消引用当前 模型中的liststore,因此它不会在内存中挂起。