Proceso terminado con el código de salida -1073741571

Tengo una función de recursión que busca el camino de Euler. No creo que la definición de la función sea relevante (pero si alguien piensa así, la pegaré también).

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

Incluso sin la pregunta antes mencionada, sé que necesito aumentar el límite de recursividad con los siguientes comandos

import sys
sys.setrecursionlimit(5000)

El problema es que cuando no importa qué número estoy usando, o bien obtengo el error de recursión Máximo o mi programa simplemente se detiene sin salida en la pantalla, pero: Proceso finalizado con el código de salida -1073741571 . Traté de buscar este código en Google y el único problema que pude encontrar fue el problema en Ruby. Alguna idea de cómo puedo superar este problema.

Si esto es relevante, estoy en Windows 8 64 bit, tengo mucha RAM y tengo 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 No hay nada para optimizar allí. Lo único que se necesita para optimizar es cambiar la recursión a while loop :-)
agregado el autor Salvador Dali, fuente
@JanneKarila hay aproximadamente 4500 aristas en el gráfico
agregado el autor Salvador Dali, fuente
@qwrrty No es infinito. Lo probé en muchos gráficos grandes y funciona correctamente. Eventualmente terminará. El problema es que en mi caso setrecursionlimit no funciona.
agregado el autor Salvador Dali, fuente
@CiaPan esta es una buena cita, pero ¿cuál fue tu punto?
agregado el autor Salvador Dali, fuente
@CiaPan gracias por la aclaración. El error con un límite de recursividad demasiado alto parece diferente y ya he comprobado que mi límite de recursión es mucho más alto que el que estoy usando aquí.
agregado el autor Salvador Dali, fuente
Si lo se. El problema es que ya no hay código. Después de intentar desesperadamente resolver el problema, desistí y lo reescribí sin recurrencia. Pero no había A llama B. Era solo una función recursivamente llamada a sí misma.
agregado el autor Salvador Dali, fuente
CPython no optimiza la recursividad de cola, así que trate de evitar usarla en esa medida.
agregado el autor Blender, fuente
docs.python.org/2/library/sys.html#sys. setrecursionlimit dice: sys. ** setrecursionlimit ** (limit) - Establece la profundidad máxima de la pila de intérpretes de Python para limitar. Este límite evita que la recursión infinita cause un desbordamiento de la pila C y bloquee Python. El límite más alto posible depende de la plataforma.
agregado el autor CiaPan, fuente
Posiblemente está tratando de establecer el límite más grande de lo que permite el entorno. Eso causaría que setrecursionlimit 'no funcione para usted'.
agregado el autor CiaPan, fuente
Sin el código fuente (y sin conocimiento de Python, en realidad), solo puedo adivinar ... Así que aquí está mi siguiente suposición: posiblemente utilices la recursión mutua, por lo que la función A llama a B, y B llama a A para cada paso del ¿solución? Eso duplicaría el número real de invocaciones.
agregado el autor CiaPan, fuente
Posiblemente, no era solo una profundidad de recursión, sino algo así como un volumen de datos de recursión. Trataría de escribir un programa de prueba para ir a una profundidad dada en una recursión lo más simple posible y probar qué tan lejos llegaría. A continuación, agregue un gran conjunto de variables para mantener en cada nivel y vuelva a probar ... Pero una vez que eliminó el código, ya no hay problemas para probar.
agregado el autor CiaPan, fuente
Si está excediendo la profundidad de recursión máxima, es muy probable que su programa esté en un ciclo de recursión infinito, en cuyo caso cambiar el límite de recursión no será de ninguna ayuda. Tendrá que averiguar qué debe hacer que su programa complete su paso recursivo, y tratar de entender por qué eso no está sucediendo.
agregado el autor Tim Pierce, fuente
Por casualidad, ¿su programa podría necesitar alguna optimización?
agregado el autor thefourtheye, fuente
¿Cuántos bordes hay en el gráfico?
agregado el autor Janne Karila, fuente

2 Respuestas

Esa es la representación con signo entero del código de error 0xC00000FD de "desbordamiento de pila/agotamiento de pila" de Microsoft.

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
agregado

Podría usar algo como:

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

Esto resolvió tanto mi limitación de recursión como mi limitación de tamaño de almacenamiento dinámico.

0
agregado