Tengo una clase de nodo personalizada en python que está integrada en un gráfico (que es un diccionario). Dado que estos tardan un tiempo en crearse, me gustaría separarlos para que no tenga que reconstruirlos cada vez que ejecuto mi código.Decapado de un gráfico con ciclos
Por desgracia, porque este gráfico tiene ciclos, cPickle golpea el máximo nivel de recursividad:
RuntimeError: maximum recursion depth exceeded while pickling an object
Esta es mi nodo de objeto:
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])
]
)
Éste es cómo construir mi gráfico:
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
Entonces en mi principal, tengo
graph = buildGraph(input_file)
bo = cPickle.dumps(graph)
y la segunda línea es donde obtengo mi error de profundidad de recursión.
¿Hay alguna solución fuera de cambiar la estructura de Node?
@delnan Los ciclos ocurren porque estoy siguiendo la pista de padres e hijos. Pero ignorando eso, el gráfico es acíclico. – JasonMond
¿Qué versión de Python estás usando? –
@EdwardLoper 2.7.1 – JasonMond