Der Prozess wurde mit dem Exit-Code -1073741571 beendet

Ich habe eine Rekursionsfunktion, die Euler-Pfad findet. Ich denke nicht, dass die Definition der Funktion relevant ist (aber wenn jemand das denkt, werde ich es auch einfügen).

The problem is that when I am running the function with a big graph, I receive the following well known error: RuntimeError: maximum recursion depth exceeded in cmp

Auch ohne die oben erwähnte Frage weiß ich, dass ich die Rekursionsgrenze mit den folgenden Befehlen erhöhen muss

import sys
sys.setrecursionlimit(5000)

Das Problem ist, dass, egal welche Nummer ich verwende, ich entweder den maximalen Rekursionsfehler bekomme oder mein Programm halt einfach ohne Ausgabe auf dem Bildschirm, aber: Prozess beendet mit Exit-Code -1073741571 . Ich habe versucht, nach diesem Code zu suchen und das einzige Problem, das ich finden konnte, war das Problem in Ruby. Irgendeine Idee, wie ich dieses Problem überwinden kann.

Wenn das relevant ist, bin ich auf Windows 8 64 Bit, ich habe viel RAM und ich habe 64bit Python.

Just because for some reason this question received some attention recently, I want to highlight that I was not able to find solution to the problem. After hopelessly trying to solve the problem I gave up and rewrote it without recursion. Also it was annoying, but I spent much less time rewriting the whole algorithm, than I spent investigating this problem. I also want to mention that I do not have previous recursion code, so I will not be able to replicate the problem.

0
@thefourtheye Dort gibt es nichts zu optimieren. Das einzige, was optimiert werden muss, ist die Rekursion in die While-Schleife zu ändern :-)
hinzugefügt der Autor Salvador Dali, Quelle
@JanneKarila gibt es ungefähr 4500 Kanten in der Grafik
hinzugefügt der Autor Salvador Dali, Quelle
@qwrrty Es ist nicht unendlich. Ich habe es an vielen großen Graphen getestet und es funktioniert korrekt. Irgendwann wird es fertig sein. Das Problem ist, dass in meinem Fall setrecursionlimit nicht funktioniert.
hinzugefügt der Autor Salvador Dali, Quelle
@CiaPan das ist ein schönes Zitat, aber was war dein Punkt?
hinzugefügt der Autor Salvador Dali, Quelle
@CiaPan danke für die Aufklärung. Der Fehler mit zu hohem Rekursionslimit sieht anders aus und ich habe bereits überprüft, dass mein Rekursionslimit viel höher ist, als ich hier verwende.
hinzugefügt der Autor Salvador Dali, Quelle
Ja ich weiß. Das Problem ist, dass es keinen Code mehr gibt. Nachdem ich hoffnungslos versucht hatte, das Problem zu lösen, gab ich es auf und schrieb es ohne Rekursion um. Aber es gab nicht A Anrufe B. Es war nur eine Funktion, die sich selbst rekursiv aufruft.
hinzugefügt der Autor Salvador Dali, Quelle
CPython optimiert die Tail-Rekursion nicht, versuchen Sie also, sie so wenig wie möglich zu verwenden.
hinzugefügt der Autor Blender, Quelle
docs.python.org/2/library/sys.html#sys. setrecursionlimit sagt: sys. ** setrecursionlimit ** (limit) - Setzt die maximale Tiefe des Python-Interpreter-Stacks auf limit. Diese Begrenzung verhindert, dass eine unendliche Rekursion einen Überlauf des C-Stack verursacht und Python abstürzt. Die höchstmögliche Grenze ist plattformabhängig.
hinzugefügt der Autor CiaPan, Quelle
Möglicherweise versuchen Sie, das Limit größer als die Umgebung zu setzen. Das würde setrecursionlimit "nicht für dich arbeiten lassen".
hinzugefügt der Autor CiaPan, Quelle
Ohne den Quellcode (und ohne Wissen über Python, eigentlich) kann ich nur raten ... Also hier ist meine nächste Schätzung: möglicherweise verwenden Sie gegenseitige Rekursion, so dass die Funktion A ruft B, und B ruft A für jeden Schritt der Lösung? Das würde die tatsächliche Anzahl der Aufrufe verdoppeln.
hinzugefügt der Autor CiaPan, Quelle
Möglicherweise war es nicht nur eine Rekursionstiefe, sondern so etwas wie ein Rekursionsdatenvolumen? Ich würde versuchen, ein Testprogramm zu schreiben, um eine bestimmte Tiefe in einer Rekursion so einfach wie möglich zu erreichen und zu testen, wie weit es gehen würde. Fügen Sie dann einige große Variablen hinzu, um sie auf jeder Ebene zu behalten und erneut zu testen ... Aber sobald Sie den Code fallen gelassen haben, gibt es kein Problem mehr zu testen.
hinzugefügt der Autor CiaPan, Quelle
Wenn Sie die maximale Rekursionstiefe überschreiten, ist es sehr wahrscheinlich, dass sich Ihr Programm in einer unendlichen Rekursionsschleife befindet. In diesem Fall ist das Ändern der Rekursionsgrenze überhaupt keine Hilfe. Sie müssen herausfinden, was Ihr Programm seinen rekursiven Schritt vervollständigen sollte, und versuchen zu verstehen, warum das nicht geschieht.
hinzugefügt der Autor Tim Pierce, Quelle
Möglicherweise bedarf Ihr Programm einer Optimierung?
hinzugefügt der Autor thefourtheye, Quelle
Wie viele Kanten befinden sich in der Grafik?
hinzugefügt der Autor Janne Karila, Quelle

2 Antworten

Das ist die vorzeichenbehaftete Integer-Darstellung von Microsofts "Stack Overflow/Stack Erschöpfung" -Fehlercode 0xC00000FD.

You might try increasing your executable's stack size as described in the answer here: How to overcome Stack Size issue with Visual Studio (running C codes with big array)

Anytime you see strange, large negative exit codes in windows, convert them to hex and then look them up in the ntstatus error codes http://msdn.microsoft.com/en-us/library/cc704588.aspx

0
hinzugefügt

Du könntest etwas verwenden wie:

if __name__ == '__main__':
    sys.setrecursionlimit(100000)
    threading.stack_size(200000000)
    thread = threading.Thread(target=your_code)
    thread.start()

Dies löste sowohl meine Rekursionsbegrenzung als auch meine Begrenzung der Speichergröße.

0
hinzugefügt