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