Как увеличить размер стека для рубинового приложения. Рекурсивное приложение, добирающееся: уровень Стека, слишком глубокий (SystemStackError)

Возможно, ваш mysql-сервер не запущен

, вы можете попробовать

/usr/local/bin/mysql.server start

34
задан Andreas 14 February 2009 в 06:10
поделиться

4 ответа

Ruby использует стек C, таким образом, Ваши опции включают использование ulimit или компиляцию Ruby с некоторым флагом размера стопки компилятора/компоновщика. Хвостовая рекурсия должна все же быть реализована, и текущая поддержка Ruby рекурсии не настолько большая. Поскольку прохладная и изящная рекурсия, Вы могли бы хотеть рассмотреть преодоление ограничений языка и написание Вашего кода по-другому.

6
ответ дан 27 November 2019 в 16:57
поделиться

Yukihiro записи Мацумото здесь

Ruby использует стек C, так, чтобы Вы использовали ulimit для определения предела на глубину стека.

8
ответ дан 27 November 2019 в 16:57
поделиться

Если Вы уверены, что у Вас нет ситуации с Бесконечной рекурсией затем, Вашему алгоритму pobably не удовлетворяют, чтобы Ruby выполнил его recirsive способом. Преобразование алгоритма от рекурсии до другого вида стека довольно легко, и я предлагаю, чтобы Вы попробовали это. Вот то, как можно сделать это.

def recursive(params)
  if some_conditions(params)
     recursive(update_params(params))
  end
end

recursive(starting_params)

преобразует в

stack = [starting_params]
while !stack.empty?
  current_params = stack.delete_at(0)
  if some_conditions(current_params)
    stack << update_params(current_params)
  end
end
13
ответ дан 27 November 2019 в 16:57
поделиться

Думайте о том, что продолжает код. Поскольку другие плакаты упомянули, что возможно взломать код C интерпретатора.как бы то ни было. Результат будет состоять в том, что Вы используете больше RAM и не имеете никакой гарантии, что Вы не унесете стек снова.

действительно хорошее решение состояло бы в том, чтобы придумать итеративный алгоритм для того, что Вы пытаетесь сделать. Иногда memoisation может помочь, и иногда Вы находите, что не используете материал, Вы спешите стек, в этом случае, можно заменить рекурсивные вызовы изменяемым состоянием.

, Если Вы плохо знакомы с этим видом материала, взглянули на SICP здесь для некоторых идей...

3
ответ дан 27 November 2019 в 16:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: