Есть ли способ ограничить память, ghci может иметь?

Я использую для отладки моего кода с помощью ghci. Часто происходит нечто подобное (не так очевидно, конечно):

ghci> let [email protected](_:x) = 0:1:zipWith(+)f x
ghci> length f

Тогда ничего не происходит в течение некоторого времени, и если я не буду реагировать достаточно быстро, ghci съел, возможно, 2 ГБ ОЗУ, заставив мою систему замерзнуть. Если это слишком поздно, единственный способ решить эту проблему - [ALT] + [PRINT] + [K].

Мой вопрос: есть ли простой способ ограничить память, которую может потреблять ghci, скажем, 1 ГБ? Если предел превышен, расчет должен быть прерван или ghci должен быть убит.

Ответ 1

Независимым способом платформы для этого является предоставление опции -M как опция опции Haskell, например,

ghci +RTS -M1m

Подробнее см. страницу документации GHC о том, как управлять RTS (системой времени выполнения).

Выход 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 [email protected](_: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.

Ответ 2

Запуск его под оболочкой с набором ulimit -m является довольно простым способом. Если вы хотите запускать с некоторым ограничением на регулярной основе, вы можете создать оболочку script, которая выполняет ulimit перед запуском ghci.