我有一个自定义gtk.treeview
包装器类来管理自己的列表库。该类有自己的方法来清除liststore的数据并用新数据覆盖它。为了测试内存消耗,树视图只显示8列中的50,000行整数。
我注意到每次调用我的函数用数据更新liststore似乎都会增加应用程序使用的内存,并且在数据被清除后它永远不会回落。
这是我的简单树视图实现:
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时,当我用新的覆盖列表库时,它从不取消分配数据的内存。我做错了什么?
答案 0 :(得分:3)
问题似乎在于对liststore中的引用的引用 树视图。因为树视图是一个存在的容器 在整个应用程序的生命周期中,旧的liststore 挂起,仍然被treeview的构造函数引用。如果 每次都会创建一个新的列表库,并且不会引用任何引用 树视图,这个问题似乎消失了。
我的解决方案:
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,因此它不会在内存中挂起。