J'ai une classe de nœud personnalisée en python qui est intégrée dans un graphe (qui est un dictionnaire). Comme ces nœuds prennent du temps à créer, j'aimerais les pickler afin de ne pas avoir à les reconstruire à chaque fois que j'exécute mon code.
Malheureusement, parce que ce graphe a des cycles, cPickle atteint la profondeur maximale de récursion :
RuntimeError: profondeur maximale de récursion dépassée lors de la mise en conserve d'un objet
Voici mon objet de nœud :
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(["Nom: " + self.name,
"\tEnfants:" + ", ".join([c.name for c in self.children]),
"\tParents:" + ", ".join([p.name for p in self.parents])
]
)
Voici comment je construis mon graphe :
def buildGraph(input):
graph = {}
idToNode = {}
for line in input:
## Entrée du texte ligne par ligne ressemble à
## nœud.source -> nœud.cible
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
Ensuite, dans mon programme principal, j'ai
graph = buildGraph(input_file)
bo = cPickle.dumps(graph)
et la deuxième ligne est celle où je reçois mon erreur de profondeur de récursion.
Y a-t-il des solutions en dehors de celle de modifier la structure de Node ?