2016-02-11 9 views
3

Я уже нашел this question и ответы на него.Haskell, Limit GHCI memory

На accepted answer вы можете увидеть мои комментарии о решении. Это не похоже на работу, например, для этой функции:

fiblist = 0 : 1 : (zipWith (+) fiblist (tail fiblist)) 

fib :: (Integral a) => a -> String 
fib n 
    | n < 10000 = show (genericIndex fiblist n) 
    | otherwise = error "The number is too high and the calculation might freeze your machine." 

Он по-прежнему делает систему бесполезной, даже если я только дать GHCI 256Mb Heap и 256Mb Stack пространство. Для простого вызова length (из бесконечного списка) он действительно работает.

Мой вопрос сейчас: как выглядит решение для всех случаев? (Есть один Если нет, то почему нет?)

Edit # 1: Дополнительная информация

  • ОС: Xubuntu 14.04
  • Оперативная память: 4 Гб
  • Точная команда, которую я использовал для GHCI: stack ghci +RTS -M256m -K256m
  • GHC Версия: stack ghc -v результаты в:

    Version 1.0.2, Git revision fa09a980d8bb3df88b2a9193cd9bf84cc6c419b3 (3084 commits) x86_64 
    ... (a lot of other stuff) ... 
    
+2

Я не понимаю ваш пример. Я добавил импорт и загрузил его в 'ghci fib.hs + RTS -M256M -K256M'. Но самым большим вычислением, которое я могу сделать с 'fib', является' fib 9999', что можно сделать в гораздо меньшем, чем 256 МБ пространства. Можете ли вы привести пример, который на самом деле демонстрирует проблему? –

+0

(И, если я делаю число 10000 больше, чтобы я мог попробовать 'fib 100000', я получаю сообщение об ошибке' : Heap исчерпан, максимальный размер кучи 268435456 байт (256 МБ), используйте '+ RTS -M ', чтобы увеличить его .') –

+1

Windows или Linux? Сколько у вас физической памяти? Каковы точные варианты предоставления GHCi? Какое точное выражение вы оцениваете? – MathematicalOrchid

ответ

6
stack ghci +RTS -M256m -K256m 

Это не установка параметров РТС GHCi, но stack. В конце концов, stack также написан в Haskell и поэтому может также использовать опции RTS.

--ghci-options Используйте, чтобы обеспечить дополнительные возможности для GHCi вместо:

stack ghci --ghci-options="+RTS -M256m -K256m -RTS" 

Закрытие -RTS необходимо, поскольку stack предоставляет некоторые дополнительные опции для GHCi.

1

Ваша проблема в вызове.

stack ghci +RTS -M256m -K256m 

Стек не пропускает эти параметры до GHCI:

/.../.stack/programs/x86_64-osx/ghc-7.10.2/lib/ghc-7.10.2/bin/ghc -B/.../.stack/programs/x86_64-osx/ghc-7.10.2/lib/ghc-7.10.2 --interactive -odir=/.../.stack/global/.stack-work/odir/ -hidir=/.../.stack/global/.stack-work/odir/ 

Если вы вместо того, чтобы вызвать GHCi непосредственно:

/usr/local/lib/ghc-7.10.3/bin/ghc -B/usr/local/lib/ghc-7.10.3 --interactive +RTS -M256m -K256m 

Yay! Аргументы!

Я подозреваю, что ваш +RTS ... на самом деле потребляется собственной RTS стека - как и в, стек написан в Haskell и следит за этими ограничениями, когда вы действительно хотите, чтобы ghci выполнял указанные ограничения. Итак ... отправьте вопрос на стек.