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选项作为 on 选项提供给 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

在带有ulimit -mset 的 shell 下运行它是一种相当简单的方法。如果您想定期运行一些限制,您可以创建一个ulimit在运行之前执行的包装脚本ghci

于 2010-09-22T06:42:15.490 回答