Есть ли способ ограничить память, GHCI может иметь?
-
04-10-2019 - |
Вопрос
Я привык отладить свой код с помощью GHCI. Часто что-то вроде это происходит (не так очевидно, конечно):
ghci> let f@(_:x) = 0:1:zipWith(+)f x
ghci> length f
Затем ничто не происходит в течение некоторого времени, и если я не договоримся достаточно быстро, GHCI съел, может быть, 2 ГБ ОЗУ, вызывая мою систему замораживанию. Если слишком поздно, единственным способом решить эту проблему является [ALT] + [Print] + [K].
Мой вопрос: есть ли простой способ ограничить память, которая может потребоваться GHCI, давайте скажем 1 ГБ? Если превышение пределов, расчет должен быть прерванным или GHCI должен быть убит.
Решение
Независимый путь платформы для достижения этого является предоставление -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.
Другие советы
Бежит его под оболочкой с ulimit -m
Набор довольно легкий путь. Если вы хотите регулярно работать с некоторым лимитом, вы можете создать сценарий обертки, который делает ulimit
перед запуском ghci
.