2

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

リストストアをデータで更新する関数を呼び出すたびに、アプリケーションが使用するメモリが増加するように見え、データがクリアされた後は決して元に戻らないことに気付きました。

これが私の単純なツリービューの実装です:

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 )

を使用するset_model(None)と、モデル内の現在のリストストアが正しく逆参照されているように見えるため、メモリ内にぶら下がることはありません。

于 2012-02-17T03:35:01.710 に答える