有没有一种方法来限制ghci可以使用的内存?

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应该被关闭。


1
请参见https://dev59.com/a1bTa4cB1Zd3GeqP913l。 - Don Stewart
2个回答

19

实现这个的一个平台无关方法是向Haskell运行时提供-M选项,如下所示:

ghci +RTS -M1m
请参考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.

3
我刚在~/.bashrc中创建了一个别名 alias ghci='ghci +RTS -M500m -RTS',现在一切都好了。非常感谢。 - fuz
1
жҲ‘еҒҮи®ҫдҪ д№ҹеҸҜд»ҘдҪҝз”ЁдҪ зҡ„.ghciж–Ү件пјҹhttp://www.haskell.org/ghc/docs/7.2.1/html/users_guide/ghci-dot-files.html - Tyler
实际上,当达到限制时,它并不会中止,因此这不是一个解决方案。此外,ghci仍然比所述使用更多的内存。例如,我有4Gb的RAM,我将其设置为-M100m。它告诉我它被设置为100Mb,这完全没问题,但是当我运行fib 100000时,程序仍然几乎冻结了我的机器。它没有像以前那样完全冻结,但内存几乎已满,并且正在填充交换空间,导致大量IO,使系统在两分钟或更长时间内无法使用。 - Zelphir Kaltstahl
我现在用 length 进行了测试 - 在这个简单的情况下它是有效的。 - Zelphir Kaltstahl
1
@Zelphir 在我的 GHCi-8.0.1 上运行良好。可能是已经修复的错误。您可以使用 stack 安装它,并创建一个别名,例如 alias ghci512="stack ghci --ghci-options '+RTS -M512m -RTS'"。如果您正在使用 stack 进行项目开发,我建议您继续使用它的 ghci,以避免在 RAM 中重复加载库和文件缓存。 - Hi-Angel
1
需要注意的是,堆大小并不是唯一可能增长的东西。 GHC 允许您控制堆的最大和建议大小、堆栈的大小以及垃圾回收器的分配区域。 - anon

2
在设置了的shell下运行它是一种相当简单的方式。如果你想经常进行某种限制性运行,你可以创建一个在运行之前进行的包装脚本。

这不起作用。我尝试了类似 ulimit -m 102400 的东西,但它仍然会消耗内存。 - fuz
我的意思是这样的:首先,我会执行类似于ulimit -v 102400的操作,然后在 ghci 启动后,我想要撤消这个操作:ulimit -v unlimited,但是我得到了一个权限错误。 - fuz
@FUZxxl 我可以建议切换到zsh:我成功重现了您的问题,但仅在bash上。 - ZyX
在bash中,您可以使用括号生成一个子shell,因此这应该设置一个仅适用于ghci的ulimit,并在子shell退出时解除限制:$(ulimit -v 1000000; ghci) - cthulahoops
值得一提的是,-v选项接受千字节。man ulimit之所以没有提到单位,原因不明。 - Hi-Angel
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接