2012-02-16 31 views
2

独自のリストストアを管理するカスタムgtk.treeviewラッパークラスがあります。このクラスには、リストストアのデータを消去し、新しいデータで上書きする独自のメソッドがあります。メモリ消費量をテストする目的で、ツリービューは8列に50,000行の整数を表示するだけです。GtkTreeView treestoreメモリ割り当て

私は、リストストアをデータで更新する関数を呼び出すたびに、アプリケーションが使用するメモリが増えているように見え、データが消去された後は元に戻りません。

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) 

私が新しいものとliststoreを上書きするとき、それはデータのメモリーを割り振り解除決して、すべての呼び出しがset_list_modelするように私には思える:

は、ここに私の単純なツリービューの実装です。私は間違って何をしていますか?

+0

ツリービューのデータストアとしてリストストアを設定するにはどうすればよいですか? – XORcist

+0

@möter申し訳ありませんが、私は無意識にそれを残しました。それを修正するために編集されました。 – Wes

+0

set_list_modelの新しいListStoreインスタンスにデータストアを再設定していないようです。 – XORcist

答えて

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) 

set_model(None)を使用して、正しくモデルの現在の liststoreデリファレンスそれはメモリにたむろしませんしているようです。