2012-02-16 20 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因此它不會在內存中流連。