GtkTreeView выделение памяти в хранилище деревьев - PullRequest
2 голосов
/ 16 февраля 2012

У меня есть пользовательский класс-оболочка gtk.treeview, который управляет собственным списком.У класса есть собственный метод, который очищает данные хранилища списков и перезаписывает их новыми данными.В целях тестирования потребления памяти древовидное представление отображает 50000 строк целых чисел в 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, когда я перезаписываю список списков с помощьюновый, он никогда не распределяет память данных.Что я делаю не так?

1 Ответ

3 голосов
/ 17 февраля 2012

Проблема, похоже, связана со ссылкой на хранилище списков в виде дерева.Поскольку древовидная структура является контейнером, который присутствует на протяжении всего жизненного цикла приложения, старое хранилище списков остается без изменений, на которое все еще ссылается конструктор древовидной структуры.Если новое хранилище списков создается каждый раз, а древовидная структура не содержит ссылки, эта проблема, похоже, исчезнет.

Мое решение:

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), похоже, правильно разыменовываеттекущее хранилище списков в модели, чтобы оно не зависало в памяти.

...