resource.setrlimit
также необходимо использовать для увеличения размера стека и предотвращения segfault
Ядро Linux ограничивает стек процессов.
Python хранит локальные переменные в стеке интерпретатор, и поэтому рекурсия занимает пространство стека интерпретатора.
Если интерпретатор Python пытается преодолеть ограничение стека, ядро Linux segfaults.
Размер ограничения стека равен управляется системными вызовами getrlimit
и setrlimit
.
Python предлагает доступ к этим системным вызовам через модуль resource
.
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)
Конечно, если вы держите увеличивая уровень ulimit, ваша операционная система закончится, что либо остановит ваш компьютер на остановке из-за безумия подкачки, либо убьет Python через OOM Killer.
Из bash вы можете увидеть и установить ограничение стека ( в kb) с:
ulimit -s
ulimit -s 10000
Значение по умолчанию для меня равно 8Mb.
См. также:
Проверено на Ubuntu 16.10, Python 2.7.12.