Сбор графа циклами

У меня есть собственный класс узла в 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

Затем в моем main у меня есть

    graph = buildGraph(input_file)
    bo = cPickle.dumps(graph)

, а во второй строке я получаю ошибку глубины рекурсии.

Есть ли какие-либо решения помимо изменения структуры узла?

6
задан JasonMond 22 February 2012 в 18:38
поделиться