Есть ли способ ограничить память, может у ghci? - PullRequest
13 голосов
/ 22 сентября 2010

Я привык отлаживать свой код с помощью ghci. Часто происходит что-то подобное (конечно, не так очевидно):

ghci> let f@(_:x) = 0:1:zipWith(+)f x
ghci> length f

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

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

Ответы [ 2 ]

18 голосов
/ 22 сентября 2010

Независимый от платформы способ сделать это состоит в том, чтобы предоставить опцию -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 голосов
/ 22 сентября 2010

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

...