【发布时间】:2012-02-22 18:38:17
【问题描述】:
我在 python 中有一个自定义节点类,它内置在一个图形(它是一个字典)中。由于创建这些需要一段时间,我想腌制它们,这样我就不必每次运行代码时都重新构建它们。
不幸的是,因为这个图有循环,cPickle 达到了最大递归深度:
RuntimeError: 酸洗对象时超出最大递归深度
这是我的节点对象:
class Node:
def __init__(self, name):
self.name = name
self.uid = 0
self.parents = set()
self.children = set()
def __hash__(self):
return hash(self.name)
def __eq__(self, that):
return self.name == that.name
def __str__(self):
return "\n".join(["Name: " + self.name,
"\tChildren:" + ", ".join([c.name for c in self.children]),
"\tParents:" + ", ".join([p.name for p in self.parents])
]
)
这就是我构建图表的方式:
def buildGraph(input):
graph = {}
idToNode = {}
for line in input:
## Input from text line by line looks like
## source.node -> target.node
source, arr, target = line.split()
if source in graph:
nsource = graph[source]
else:
nsource = Node(source)
nsource.uid = len(graph)
graph[source] = nsource
idToNode[nsource.uid] = nsource
if target in graph:
ntarget = graph[target]
else:
ntarget = Node(target)
ntarget.uid = len(graph)
graph[target] = ntarget
idToNode[ntarget.uid] = ntarget
nsource.children.add(ntarget)
ntarget.parents.add(nsource)
return graph
然后在我的主要,我有
graph = buildGraph(input_file)
bo = cPickle.dumps(graph)
第二行是我得到递归深度错误的地方。
除了改变Node的结构,有什么解决办法吗?
【问题讨论】:
-
@delnan 循环发生是因为我在跟踪父母和孩子。但忽略这一点,该图是无环的。
-
你用的是什么版本的 Python?
-
Pickle 处理循环数据结构应该没有问题;我预计这种递归深度异常的根本原因不是循环的存在,而是其他原因。