Ho una classe nodo personalizzata in python incorporata in un grafico (che è un dizionario). Dal momento che questi richiedono un po 'di tempo per creare, mi piacerebbe metterli sottosopra in modo da non doverli ricostruire ogni volta che eseguo il mio codice.Decapaggio di un grafico con cicli
Purtroppo, perché questo grafico ha cicli, cPickle colpisce la massima profondità di ricorsione:
RuntimeError: maximum recursion depth exceeded while pickling an object
Questo è il mio oggetto nodo:
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])
]
)
Questo è come io costruisco il mio grafico:
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
Quindi nel mio main, ho
graph = buildGraph(input_file)
bo = cPickle.dumps(graph)
e la seconda riga è dove ottengo il mio errore di profondità di ricorsione.
Esistono soluzioni che non modificano la struttura del nodo?
@delnan I cicli si verificano perché sto tenendo traccia di genitori e figli. Ma ignorandolo, il grafico è aciclico. – JasonMond
Quale versione di Python stai usando? –
@EdwardLoper 2.7.1 – JasonMond