2012-02-16 43 views
2

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

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

这是我简单的TreeView实现:

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,当我覆盖liststore用一个新的,它永远不会释放这些数据的存储。我究竟做错了什么?

+0

如何将列表存储设置为树视图的数据存储? – XORcist 2012-02-16 20:14:08

+0

@möter对不起,我无意中将它遗漏了。编辑来解决这个问题。 – Wes 2012-02-16 21:07:09

+0

您似乎没有将数据存储重新设置到set_list_model中的新ListStore实例。 – XORcist 2012-02-16 21:35:52

回答

3

这个问题似乎与参考 treeview中的liststore有关。由于树视图是在应用程序的整个生命周期中存在 的容器,因此旧的列表存储 挂起,仍由树视图的构造函数引用。如果 每次都创建一个新的列表存储,并且没有参考被 树视图保存,那么问题似乎就消失了。

我的解决方案:

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因此它不会在内存中流连。