Я использую для отладки моего кода с помощью ghci. Часто происходит нечто подобное (не так очевидно, конечно):
ghci> let f@(_: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 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.
Ответ 2
Запуск его под оболочкой с набором ulimit -m
является довольно простым способом. Если вы хотите запускать с некоторым ограничением на регулярной основе, вы можете создать оболочку script, которая выполняет ulimit
перед запуском ghci
.