Как увеличить максимальный размер стека вызовов в Node.js

Это отличается от других вопросов, касающихся сообщения об ошибке в узле, которое гласит: RangeError: превышен максимальный размер стека вызовов, поскольку я точно знаю, почему я получаю это сообщение об ошибке. Это происходит потому, что я рекурсивно, на самом деле довольно много рекурсивно.

Спасибо.


person thomas-peter    schedule 04.07.2012    source источник


Ответы (2)


От 1_:

node --max-stack-size=val

Обновление: как показывают комментарии, несмотря на то, что в тексте справки по-прежнему указан параметр --max-stack-size, в узле v0.10.x вместо него необходимо использовать --stack-size.

node --stack-size=val
person JohnnyHK    schedule 04.07.2012
comment
довольно очевидно, теперь я смотрю --help :) - person thomas-peter; 04.07.2012
comment
По какой-то причине мне подходит --stack-size, а не --max-stack-size. - person boh; 17.05.2013
comment
Каков будет максимальный безопасный размер стека? Будет ли это зависеть от циклов процессора? - person Logan; 18.10.2013
comment
Логан, я думаю, это проблема памяти. - person astone26; 24.02.2014
comment
node --stack-size=8192 — это максимальное значение на моем сервере Ubuntu. Все, что больше этого, не увеличивает максимальную рекурсию моих функций. Обратите внимание, что единицей --stack-size является КБ, так что это около 8 МБ. В Windows я не могу получить более 1 МБ. - person cprcrack; 08.10.2014
comment
такая же проблема, если увеличить размер стека, появится новая ошибка - ошибка сегментации - person NeiL; 27.05.2015
comment
ошибка сегментации и здесь - person phani; 02.11.2015
comment
»Похоже, это распространенное недоразумение, но --stack_size=... не изменяет размер стека, а сообщает node/V8, насколько он велик. Если вы установите для него значение, превышающее фактический размер, он будет превышен. ">github.com/nodejs/node/issues/17416#issuecomment-348545847 - person Björn Höhrmann; 02.07.2018

В версиях узла 5 и 6 я проверил, что опция установки максимального размера стека — «--stack_size» (с подчеркиванием):

$  node --v8-options
[...]
--stack_size (default size of stack region v8 is allowed to use (in kBytes))
      type: int  default: 984

Чтобы увеличить максимальный размер стека, просто введите что-то вроде:

$ node --stack_size=1200

Как отмечают другие, имейте в виду, что увеличение этого значения может привести к ошибке сегментации. Максимальное безопасное значение для меня с версией 6 составляет 1361, но кажется выше с версией 5.

Глядя на общую картину, увеличение размера стека может не решить всех ваших проблем. При написании рекурсивных функций в узле лучше всего писать их в хвостовой рекурсивный способ , так как версия 6 поддерживает правильные хвостовые вызовы. Это устранит переполнение стека.

person Florent Angly    schedule 06.07.2017
comment
Проблема в том, что есть много способов заполнить стек - map, forEach, Promise.all.... - person Greg Bell; 13.02.2018
comment
Оптимизация хвостовых вызовов поддерживается только Safari — Node прекратил поддержку: node.green - person Alexandre Andrade; 18.04.2021