Вопрос

Я привык отладить свой код с помощью 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top