我需要创建一个可以访问其子节点但也可以访问其父节点的容器。 这是一个我想如何做的简单例子:
import numpy as np
import gc
class Node(object):
def __init__(self, name):
self.parent = None
self.child = []
self.name = name
self.mem_tracer = np.ones(10 ** 6)
def append(self, obj):
assert(isinstance(obj, Node))
self.child.append(obj)
obj.parent = self
但是,当我尝试删除节点时,我有一个内存问题(请注意,属性mem_tracer就在这里,以便能够看到对象是否已从内存中删除)
此代码显示问题(给出每行的内存状态):
print 'start' # 16.96Mb
a = Node('0') # 24.79Mb
a.append(Node('0/0')) # 32.61Mb
a.append(Node('0/1')) # 40.42Mb
a.child[0].append(Node('0/0/0')) # 48.24Mb
a.child[0].append(Node('0/0/1')) # 56.06Mb
a.child[1].append(Node('0/1/0')) # 63.87Mb
a.child[1].append(Node('0/1/1')) # 71.69Mb
del a.child[0] # 71.69Mb
gc.collect() # 48.24Mb
垃圾回收器无法收集已删除的对象,因为对它的引用仍存在于其子对象中(而它们不再被引用)。
我们可以在最后一行看到,对gc.collect
的显式调用解决了这个问题,但我更愿意摆脱它,因为它非常耗时!
那么有没有其他方法来访问父容器而不是将其存储到属性中? 提前谢谢。