我有一個自定義的節點類在python內置到一個圖形(這是一個字典)。由於這些需要一段時間才能創建,所以我想醃製它們,以便每次運行代碼時都不必重新構建它們。用週期醃一個圖
不幸的是,因爲這個圖有個週期,cPickle的命中最大遞歸深度:
RuntimeError: maximum recursion depth exceeded while pickling an object
這是我的節點對象:
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循環發生是因爲我跟蹤父母和孩子。但忽略這一點,該圖是非循環的。 – JasonMond 2012-02-22 18:55:31
您使用的是什麼版本的Python? – 2012-02-22 20:02:29
@EdwardLoper 2.7.1 – JasonMond 2012-02-22 20:42:29