2

我有一个gtk.treeview管理自己的列表存储的自定义包装类。该类有自己的方法,可以清除列表存储的数据并用新数据覆盖它。出于测试内存消耗的目的,treeview 仅在 8 列中显示 50,000 行整数。

我注意到每次调用我的函数来更新列表存储数据似乎都会增加应用程序使用的内存,并且在清除数据后它永远不会恢复。

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

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 时,当我用新的列表存储覆盖时,它永远不会取消分配数据的内存。我究竟做错了什么?

4

1 回答 1

3

问题似乎出在树视图中对列表存储的引用。因为树视图是一个存在于应用程序整个生命周期中的容器,所以旧的列表存储仍然存在,仍然被树视图的构造函数引用。如果每次都创建一个新的列表存储并且树视图没有引用,那么这个问题似乎就消失了。

我的解决方案:

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 )

Usingset_model(None)似乎可以正确取消引用模型中的当前列表存储,因此它不会在内存中徘徊。

于 2012-02-17T03:35:01.710 回答