Ошибка SBCL: "стек привязки исчерпан" при запуске Maxima на Linux-машине

Я понимаю, что есть много мест, где я могу задать этот вопрос, но я решил попробовать здесь. Мне кажется, что я уже получил столько помощи, сколько мог от хороших людей в Maxima.

я запускаю Maxima с SBCL и последовательно получаю ошибки;

INFO: Binding stack guard page unprotected
Binding stack guard page temporarily disabled: proceed with caution

Maxima encountered a Lisp error:

 Binding stack exhausted.

PROCEED WITH CAUTION.

Automatically continuing.
To enable the Lisp debugger set *debugger-hook* to nil.
INFO: Binding stack guard page reprotected

Я изменил вызов Maxima (его исполняемый файл), добавив большие значения для динамическое пространство размере и размер стека управления, а я посмотрел на ./.../ sbcl-help для любых идей аргументов добавить в $MAXIMA_LISP_OPTIONS в исполняемом файле maxima.

кроме того, я обычно делаю это перед тем, как запустить его (Хотя я думаю, что они не нужны, поскольку ОС умна, ну, может быть, с последним нужно возиться);

sudo fstrim -v /
echo 3 | sudo tee /proc/sys/vm/drop_caches
echo 262144 | sudo tee /proc/sys/vm/max_map_count

и после пары расчетов во время выполнения моей работы Maxima, я бросаю пару

:lisp (sb-ext:gc :full t)

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

мои вычисления несколько интенсивны и рекурсивны, хотя я использую memoization в работе Maxima. Мой компьютер описывается inxi-b as,

System:    Host: XXX-MacBookPro Kernel: 4.10.0-33-generic x86_64 (64 bit) Desktop: Cinnamon 3.4.6
           Distro: Linux Mint 18.2 Sonya
Machine:   System: Apple (portable) product: MacBookPro11 3 v: 1.0
           Mobo: Apple model: Mac-2BD1B313 v: MacBookPro11 3
           Bios: Apple v: MBP112.88Z.0138.B25.1702171721 date: 02/17/2017
CPU:       Quad core Intel Core i7-4980HQ (-HT-MCP-) speed/max: 1402/4000 MHz
Graphics:  Card: NVIDIA GK107M [GeForce GT 750M Mac Edition]
           Display Server: X.Org 1.18.4 drivers: nvidia (unloaded: fbdev,vesa,nouveau)
           Resolution: 2880x1800@59.99hz
           GLX Renderer: GeForce GT 750M/PCIe/SSE2 GLX Version: 4.5.0 NVIDIA 375.66
Network:   Card-1: Broadcom BCM4360 802.11ac Wireless Network Adapter driver: wl
           Card-2: Broadcom NetXtreme BCM57762 Gigabit Ethernet PCIe driver: tg3
Drives:    HDD Total Size: 1000.6GB (17.5% used)
Info:      Processes: 291 Uptime: 43 min Memory: 3366.6/15953.7MB Client: Shell (bash) inxi: 2.2.35 

а мои Maxima и SBCL построены из GIT и совсем новые ~ около 2 недель,а из head и прошли все свои тесты. Кроме того, мой своп выглядит так:

XXX@XXX-MacBookPro ~/ResearchWC $ cat /proc/swaps 
Filename                Type        Size    Used    Priority
/70GiB.swap                             file        73400316    0   -2
/dev/sda7                               partition   25564776    0   -1

и я часто в основном из память и вокруг 20-30G в обмен.

обычно он, кажется, висит в конце концов (скажем, через 100 часов, как я заметил htop перестает показывать определенную активность, и вентилятор не идет вверх и вниз), и я думаю, что ошибки истощения иногда похоронены во встроенных рекурсивных вызовах. Я получил это сообщение об ошибке выше, потому что я избегал вызова функции на уровне рекурсии, который я хочу, и вместо этого создал их "вручную" на терминале. Например, вместо того, чтобы просто позвонить кому-то как и fib (10), я вместо этого вызывал последовательно fib(1), fib(2), fib(3), где каждое предыдущее значение было записано.

у меня есть время, но, похоже, не знаю, как максимизировать мой swap - watching htop я никогда не видел, чтобы он использовал больше, чем скажем ~25%.

1.) Кто-нибудь знает, что еще я могу сделать с SBCL, чтобы избежать этих ошибок?

2.) Будет ли другой lisp лучше работать в этих ситуациях, например ecl, cml и т. д.?

спасибо заранее за любой совет, и я могу предоставить более подробную информацию, если это необходимо.

обновление

после увеличения размера динамического пространства, размера стека и размера стека привязки я столкнулся с ограничением кучи вместо стека привязки на этот раз, когда он разбился. Прилагается вывод backtrace (не уверен, что два регистра pc и fp... - счетчик программ и указатель кадров?). Я запустил это с trace (остаток, Тейлор), а также, но никогда ничего не видел рыбный...

ldb> backtrace
Backtrace:
   0: SB-BIGNUM::MULTIPLY-BIGNUM-AND-FIXNUM, pc = 0x21cb1336, fp = 0x7ffff3943f18
   1: SB-KERNEL::TWO-ARG-*, pc = 0x21cb00a7, fp = 0x7ffff3943f98
   2: MAXIMA::CTIMES, pc = 0x21e076b4, fp = 0x7ffff3943fc0
   3: MAXIMA::PCTIMES, pc = 0x21de5f4c, fp = 0x7ffff3943ff0
   4: MAXIMA::PCTIMES1, pc = 0x21e78f1e, fp = 0x7ffff3944048
   5: MAXIMA::PCTIMES, pc = 0x21de6033, fp = 0x7ffff3944078
   6: MAXIMA::PCETIMES1, pc = 0x21fe0560, fp = 0x7ffff39440d8
   7: MAXIMA::PTIMES1, pc = 0x21f457e5, fp = 0x7ffff3944148
   8: MAXIMA::PTIMES, pc = 0x21db6561, fp = 0x7ffff3944180
   9: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39441b8
  10: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39441f0
  11: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944228
  12: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944260
  13: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944298
  14: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39442d0
  15: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944308
  16: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944340
  17: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944378
  18: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39443b0
  19: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39443e8
  20: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944420
  21: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944458
  22: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944490
  23: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39444c8
  24: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944500
  25: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944538
  26: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944570
  27: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39445a8
  28: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39445e0
  29: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944618
  30: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944650
  31: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944688
  32: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39446c0
  33: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39446f8
  34: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944730
  35: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944768
  36: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39447a0
  37: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39447d8
  38: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944810
  39: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944848
  40: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944880
  41: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39448b8
  42: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39448f0
  43: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944928
  44: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944960
  45: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944998
  46: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39449d0
  47: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944a08
  48: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944a40
  49: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944a78
  50: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ab0
  51: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944ae8
  52: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944b20
  53: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944b58
  54: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944b90
  55: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944bc8
  56: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944c00
  57: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944c38
  58: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944c70
  59: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944ca8
  60: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ce0
  61: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944d18
  62: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944d50
  63: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944d88
  64: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944dc0
  65: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944df8
  66: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944e30
  67: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944e68
  68: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ea0
  69: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944ed8
  70: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944f10
  71: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944f48
  72: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944f80
  73: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944fb8
  74: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ff0
  75: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945028
  76: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945060
  77: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945098
  78: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39450d0
  79: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945108
  80: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945140
  81: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945178
  82: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39451b0
  83: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39451e8
  84: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945220
  85: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945258
  86: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945290
  87: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39452c8
  88: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945300
  89: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945338
  90: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945370
  91: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39453a8
  92: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39453e0
  93: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945418
  94: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945450
  95: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945488
  96: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39454c0
  97: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39454f8
  98: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945530

1 ответов


наиболее распространенной причиной переполнения стека bind является рекурсивная функция, которая вызывает себя бесконечно (т. е. ошибка в рекурсии). Второй наиболее распространенной причиной является рекурсивная функция, которая программируется правильно, но вызывает себя слишком много раз для реализации Lisp для ее обработки.

Я забыл, что предел стека для SBCL - это может быть 8192, но это всего лишь предположение. Вероятно, вы могли бы определить его экспериментально (если не читая SBCL документация.)

в любом случае вы можете попытаться выяснить, какие функции или функции вызывают проблемы через

trace (mymaximafun1, mymaximafun2, ...);

для функций Maxima и/или

:lisp (trace mylispfun1 mylispfun2 ...)

для функций Lisp.

о второй проблеме вы можете попытаться избежать глубоких рекурсий, переработав рекурсивные функции как итерации.

Вы упомянули, что у вас есть длительные вычисления. Стратегия для уменьшения эффекта сбоев заключается в вызове save функция сохранения состояния программы Время от времени, например:

save ("mycheckpointfile.lisp", all);

отметим, что save принимает много вариантов, поэтому, возможно, взгляните на документацию через ? save.

вы можете автоматически генерировать имена файлов с помощью некоторых рецептов, например file_name : printf(false, "mycheckpointfile~d.lisp", 1000 + random(9000)), который генерирует случайное 4-значное число и вставить его в имя файла. Конечно, таких рецептов много.