resource.setrlimit
también se debe usar para aumentar el tamaño de la pila y evitar la falla predeterminada
El kernel de Linux limita la pila de procesos .
Python almacena variables locales en la pila del intérprete, por lo que la recursión ocupa espacio en la pila del intérprete.
Si el intérprete de Python intenta superar el límite de la pila, el kernel de Linux lo convierte en un error de segmentación.
El tamaño límite de la pila se controla con las getrlimit
y setrlimit
llamadas al sistema.
Python ofrece acceso a esas llamadas del sistema a través del resource
módulo.
import resource
import sys
print resource.getrlimit(resource.RLIMIT_STACK)
print sys.getrecursionlimit()
print
# Will segfault without this line.
resource.setrlimit(resource.RLIMIT_STACK, [0x10000000, resource.RLIM_INFINITY])
sys.setrecursionlimit(0x100000)
def f(i):
print i
sys.stdout.flush()
f(i + 1)
f(0)
Por supuesto, si sigue aumentando ulimit, su RAM se agotará, lo que ralentizará su computadora debido a la locura del intercambio o matará a Python a través del OOM Killer.
Desde bash, puede ver y establecer el límite de la pila (en kb) con:
ulimit -s
ulimit -s 10000
El valor predeterminado para mí es 8Mb.
Ver también:
Probado en Ubuntu 16.10, Python 2.7.12.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
line <n>, in <module>
trazas en la pila) y este código toma 2 cuadros de pilan=1
(porque el caso base esn < 1
, porn=1
lo que aún se repite). Y supongo que el límite de recursión no es inclusivo, ya que en "error cuando alcanza 1000" no "error si excede 1000 (1001)".997 + 2
es inferior a 1000, por lo998 + 2
que no funciona porque llega al límite.recursive_function(997)
funciona, se rompe a las998
. Cuando lo llamarecursive_function(998)
, usa 999 marcos de pila y el intérprete agrega 1 marco (porque su código siempre se ejecuta como si fuera parte del módulo de nivel superior), lo que hace que llegue al límite de 1000.