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

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

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

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

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

 Don Stewart22 апр. 2011 г., 23:55
Смотрите такжеstackoverflow.com/questions/5716216/...

Ответы на вопрос(2)

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

 fuz22 сент. 2010 г., 15:18
@ ZyX Я слишком ленивый.
 fuz22 сент. 2010 г., 08:54
Это не работает Я пробовал что-то вродеulimit -m 102400 и он все еще потребляет память.
 cthulahoops23 сент. 2010 г., 12:55
В bash вы можете использовать круглые скобки для создания подоболочки, поэтому следует установить ulimit, который применяется только к ghci и отменяется при выходе из подоболочки: $ (ulimit -v 1000000; ghci)
 ZyX22 сент. 2010 г., 15:02
@FUZxxl Я могу предложить перейти на zsh: мне удалось воспроизвести вашу проблему, но только на bash.
 Hi-Angel14 авг. 2016 г., 23:01
Стоит упомянуть,-v Опция принимает килобайты.man ulimit почему-то ничего не говорит о единицах.
 fuz22 сент. 2010 г., 14:10
Спасибо. Я считаю это менее полезным, так как я не могу изменить значение в оболочке снова после этого. (Только вниз ...)
 fuz22 сент. 2010 г., 14:30
Я имею в виду следующее: во-первых, я делаю что-то вродеulimit -v 102400затем - после ghci - я хочу отменить:ulimit -v unlimited, но я получаю ошибку разрешения.
 ZyX22 сент. 2010 г., 13:27
@hobbs @FUZxxl ты должен использоватьulimit -vнеulimit -m. -m Коммутатор ограничивает физическую память, а вам нужно ограничить виртуальную: физическая + своп. я используюulimit -v $(( (1024**2)*2 )) (zsh) с 4 ГБ ОЗУ + 5 ГБ подкачки, и это не останавливает систему. Это ограничивает объем памяти до 2 ГиБ и может быть помещен в~/.zshrc или же~/.bashrc.
 ZyX22 сент. 2010 г., 14:27
@FUZxxl Почему ты не можешь? У меня нет проблем с этим (или вы имели в виду, что вы не можете изменить его с GHCi?). Это может быть менее полезно, потому что, когда процесс исчерпывает память, он может перехватить SEGV и аварийно завершить работу, но GHCi обрабатывает это нормально. В zsh есть некоторая полезная функция: в случае сбоя какого-либо приложения, изменяющего настройки tty (например, vim), вы получите беспорядок на экране и некоторые клавиши не будут работать. Zsh встроенныйttyctl с аргументом-f предотвратит это.
Решение Вопроса

чтобы-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.
 fuz22 сент. 2010 г., 10:17
Я только что создал псевдонимalias ghci='ghci +RTS -M500m -RTS' в~/.bashrc и сейчас все в порядке. Большое спасибо.
 Hi-Angel02 окт. 2016 г., 12:23
@Zelphir работает для меня с GHCi-8.0.1. Вероятно, ошибка, которая была исправлена. Вы можете установить его с помощью стека и создать псевдоним, например,alias ghci512="stack ghci --ghci-options '+RTS -M512m -RTS'", Если вы используете стек для проектов, я бы все равно рекомендовал придерживаться его ghci, чтобы не дублировать библиотеки и файловый кеш в ОЗУ.
 MatrixFrog24 нояб. 2011 г., 21:10
Я полагаю, вы могли бы также использовать свой.ghci файл?haskell.org/ghc/docs/7.2.1/html/users_guide/ghci-dot-files.html
 Zelphir Kaltstahl11 февр. 2016 г., 02:21
На самом деле это не прерывается при достижении предела, поэтому это не решение. Кроме того, GHCI продолжает использовать больше памяти, чем указано. Например у меня4Gb оперативной памяти, я установил его-M100m, Это говорит мне, что установлено100Mb, что совершенно нормально, но когда я запускаюfib 100000 программа все еще почти останавливает мою машину. Он не полностью замораживает его, как раньше, но память почти заполнена, и происходит заполнение подкачки, что вызывает много операций ввода-вывода, что делает систему непригодной для использования в течение двух или более минут.
 Zelphir Kaltstahl11 февр. 2016 г., 02:36
Я сейчас проверил это сlength - в этом простом случае это работает.
 Evi1M4chine08 окт. 2017 г., 03:45
Следует отметить, что размер кучи - не единственное, что может расти. GHC позволяет вам контролировать максимальный и рекомендуемый размер кучи, размер стека и область выделения сборщика мусора.

Ваш ответ на вопрос