2013-04-13 9 views
6

Ich versuche Instanz meiner zellulären Automaten Klasse beizen, aber ich habe diesen Fehler:Python pickler - Rekursionstiefe überschritten

RuntimeError: maximum recursion depth exceeded while calling a Python object 

Meine zellulären Automaten aus der Liste aus Zellen bestehen (und Haufen anderer Dinge) wo jede Zelle einen Zeiger auf ihre Nachbarn hat. In diesem speziellen CA gibt es 256 Zellen. Jetzt weiß ich, dass der Abbeißer bereits gebeizte Objekte erkennen kann.

From docs:
*The pickle module keeps track of the objects it has already serialized, so that later references to the same object won’t be serialized again.

Also ich weiß nicht wirklich, warum ich die maximale Rekursionstiefe überschreite.

Ich denke, dass vielleicht Pickler Tiefe erste Beizen, so dass es zuerst folgen Zeiger, Rekursionstapel überschreiten und dann Ausnahme auslösen. Ich weiß, dass ich die maximale Rekursionstiefe mit sys.setrecursionlimit() erweitern kann, aber ich halte das nicht für eine gute oder skalierbare Lösung.

Erste Frage: Ist der Pickler tief in die Tiefe gebeizt?
Zweite Frage: Haben Sie eine Idee, wie Sie diese Ausnahme verhindern können?

+0

Code, den Sie posten können? –

+0

Ja, "Gurke" geht Tiefe zuerst. Leider denke ich nicht, dass es da eine gibt. Versuchen Sie 'cPickle', aber es wird wahrscheinlich den gleichen Fehler geben. –

+0

@AswinMurugesh eigentlich habe ich zu viel Code zu posten. Hier sind jedoch einige wichtige Dateien, wenn Sie interessiert sind: [Nachbarschaft] (https://github.com/mirobeka/cellular-automata/blob/master/cellular_automata/lattices/neighbourhoods.py) [Zelle] (https://github.com/mirobeka/cellular-automata/blob/master/cellular_automata/cells/regular.py#L21) [pickling] (https://github.com/mirobeka/cellular-automata/blob/master/cellular_automata/ Gitter/Equiangular.py # L210) Exp: cPickle ist das gleiche, ich habe es schon einmal versucht. Ich hatte Angst vor dieser Antwort –

Antwort

6

Also, wie @ExP sagte, macht Pickler Tiefe erste Beizen, die Rekursion überschritten Ausnahme verursacht. Wie auch immer, ich habe hier eine Lösung gefunden bugs.python.org. Das bedeutet für Python 3.1 Picker funktioniert sogar auf rekursive Daten wie zum Beispiel Grafiken.

Es gibt auch etwas weniger elegante Lösung, die viel mehr Zeit braucht, um einige rekursive Daten zu picken, aber es ist einfach (nur eine Frage von ein paar Zeilen Code). Link here.

Wie es scheint, ist es wahrscheinlich an der Zeit, sich langsam auf den python3 zuzubewegen. Ich hoffe, dass jemand diese Antwort nützlich findet.

+0

Wenn Sie das Update von http://bugs.python.org verwenden/issue2480, stellen Sie sicher, dass Sie die Python-Datei nonrecursivepickler-fixed.py über die andere verwenden. Auch, diese Pickle-Lösung komprimiert viel weniger als Vanille Pickle, so dass Ihre Pickle-Dateien größer werden. Danke für die Lösung! – kevin948

+2

Obwohl diese Version von issue2480 funktioniert, ist sie für große Strukturen aufgrund der Verwendung von list.pop (0) und list.extend sehr ineffizient.Auf meiner großen Datenstruktur dauerte es 10 Stunden zu pickeln. Ein Umschreiben mit deques reduziert das auf 4 Minuten. – strubbly

Verwandte Themen