13

ghci を使用してコードをデバッグするのに慣れています。多くの場合、次のようなことが起こります (もちろん、それほど明白ではありません)。

ghci> let f@(_:x) = 0:1:zipWith(+)f x
ghci> length f

その後、しばらく何も起こらず、すぐに反応しないと、ghci がおそらく 2 GB の RAM を消費し、システムがフリーズします。遅すぎる場合、この問題を解決する唯一の方法は [ALT] + [PRINT] + [K] です。

私の質問: ghci が消費できるメモリを、たとえば 1 GB に制限する簡単な方法はありますか? 制限を超えた場合は、計算を中止するか、ghci を強制終了する必要があります。

4

2 に答える 2

19

これを実現するためのプラットフォームに依存しない方法は、-Mこのように Haskell ランタイムにオプションとしてオプションを提供することです。

ghci +RTS -M1m

詳細については、RTS (ランタイム システム) の制御方法に関する GHC ドキュメントのページを参照してください。

出力は次のghciようになります。

>ghci +RTS -M10m
GHCi, version 6.12.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> let f@(_:x) = 0:1:zipWith(+)f x
Prelude> length f
Heap exhausted;
Current maximum heap size is 10485760 bytes (10 MB);
use `+RTS -M<size>' to increase it.
于 2010-09-22T06:59:25.230 に答える
2

setを使用してシェルで実行するのulimit -mは、かなり簡単な方法です。一定の制限を設けて定期的に実行したい場合は、ulimit実行前に実行するラッパー スクリプトを作成できますghci

于 2010-09-22T06:42:15.490 に答える