2017-10-09 27 views
6

この質問をすることができる場所はたくさんありますが、ここで試してみると思いました。私はすでに、マキシマの善良な人々からできる限り多くの助けを得ているようです。SBCLエラー: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 

Iは動的空間サイズ制御スタックサイズため大きな値を加算することによってマキシマ(その実行)への呼び出しを変更した、と私はを見た./.../sbcl -helpには、maxima実行可能ファイルの中で$ MAXIMA_LISP_OPTIONSに追加する引数のアイデアがあります。また、私は通常、私は(私はOSがスマートであるとして、彼らは不要です想像しても、うまく多分最後の1をいじっする必要があります)、それを実行する直前にこれらを

を行います。

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

やカップルの計算後の私のマキシマの仕事をしながら、私はこのエラーを回避することを望んで

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

のカップルで投げます。私はlispをよく知らないし、確かにガベージコレクションに関するすべてを理解していない。私はマキシマの仕事でメモ化を利用していますけれども

私の計算では、やや集中的かつ再帰的です。私のコンピュータは、inxiとして-bによって

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: [email protected] 
      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 

に記載されているし、私のマキシマとSBCLは、GITから構築され、〜約2週間、及びヘッドとは全く新しいものであり、全ての彼らのメイクテストに合格しています。さらに私のスワップは次のように見えます。

[email protected] ~/ResearchWC $ cat /proc/swaps 
Filename    Type  Size Used Priority 
/70GiB.swap        file  73400316 0 -2 
/dev/sda7        partition 25564776 0 -1 

と私は多くの場合、スワップにメモリ不足と20-30Gの周りに基本的にしています。

通常、最終的にハングアップしているようだ(後に私はホテルトップ一定の活性を示し中止し、ファンに気づくように上下に行くしない、100時間を言う)と私は枯渇エラーが時々埋め込まれた再帰的に埋め込まれていると思いますコール。上記のエラーメッセージは、私が必要とする再帰レベルで関数を呼び出すのを避けて、代わりにターミナルで手作業でビルドしたためです。 E.G.はfib(10)のようなものを呼び出すのではなく、代わりにfib(1)、fib(2)、fib(3)を連続して呼び出しました。

私は時間がありますが、見た目にはスワップを最大限に活用する方法がわかりませんhtop私はそれが〜25%以上の使用を見たことはありません。

1)誰もが、私はこれらのエラーを回避するために、SBCLで行うことができます他に何を知っていますか?

2.)これらの状況では、他のリスプを実行する方が良いでしょうか? ecl、cmlなど?

アドバイスをいただきありがとうございます。必要に応じて詳細をお知らせいたします。

UPDATE

動的空間サイズ、スタックサイズ、および結合スタックサイズを増額した後、私は代わりに結合スタックのヒープ限界に対して、それがクラッシュした。この時間でした。添付されているのは、バックトレースの出力です(2つのレジスタpcとfpが何であるかわかりません... - プログラムカウンタとフレームポインタ?)。私も(残基、テイラー)トレースでこれを実行しましたが、怪しいものを見たことがない...

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

スタックとヒープは2つの異なるものです。 'Binding stack exhausted'は通常、高い再帰深度を指します。大きなヒープ/スワップは、メモリリークやすべてのメモリを解放できないGCによって発生します。聞くべき最もよい場所はSBCLメーリングリストです。代わりの実装は、Clozure CLです。 –

+0

@RainerJoswig Common Lispの最大呼び出しスタック深度を判断する方法はありますか?そうでない場合は特にSBCLのために?スタックの最大深度を示す定数がありますが、Web検索ではそのようなものは見つからないようです。おそらくそれは私の考えの中で希望のビットです。 –

+0

「最大呼び出しスタック深度」の唯一の場所は、プロファイリングのセクション15.2.4および15.2.5(http://sbcl.org/manual/index.html)と、バインディングとバインド解除の説明ですセクション8.2の内部マニュアル(http://sbcl.org/sbcl-internals/Binding-and-unbinding.html#Binding-and-unbinding)を参照してください。クイック2つの質問(おそらく@RobertDodierが@RainerJoswigに尋ねたもの)は、いくつかの変更可能な変数によって制御される拘束スタック深さであり、 "制御スタックサイズ"はこれに何らかの影響を与えますか?私はvalidate.hでBINDING_STACK_SIZEを1024 * 1024に設定して#defineを見ましたが、それを増やすことはできますか? – nate

答えて

4

バインドスタックオーバーフローの最も一般的な原因は(つまり再帰のバグ無限に自分自身を呼び出す再帰関数であります)。 2番目によくある原因は正しくプログラムされた再帰関数ですが、それを処理するにはLisp実装のために何度も呼び出します。

私はSBCLのスタック制限を忘れています - それは8192かもしれませんが、それは単なる推測です。あなたはおそらく実験でそれを判断することができます(そうでない場合は、SBCLのドキュメントを読んでください)。あなたはMaxima関数および/またはLispの機能のための

:lisp (trace mylispfun1 mylispfun2 ...) 

ため

trace (mymaximafun1, mymaximafun2, ...); 

を経由して、トラブルの原因となっている関数や機能を理解しようとすることができるいずれの場合も

第2の問題点については、再帰関数を反復として再処理することで深い再帰を避けることができます。

あなたは長時間の計算があると述べました。クラッシュの影響を軽減するための戦略は、例えば、すべての今して、プログラムの状態を保存するためにsave機能を呼び出すことです:

save ("mycheckpointfile.lisp", all); 

saveは多くのオプションをとり、ので、多分ドキュメントを見ていることvia ? save

file_name : printf(false, "mycheckpointfile~d.lisp", 1000 + random(9000))などのレシピを使用して自動的にファイル名を生成し、ランダムな4桁の数字を生成してファイル名に貼り付けることができます。もちろん、そのようなレシピがたくさんあります。

+0

ありがとう、あなたのトレースの提案は明らかなエラーには至っていませんが、まだ狩りは... – nate

+1

スタックトレースを取得することができます - プログラムがSBCLデバッガプロンプトに行く場合、 ':backtrace'を試してください。それがうまくいくかどうかはわかりません。 –

関連する問題