Haskell, 限制 GHCI 内存
Haskell, Limit GHCI memory
我已经找到 this question 及其答案。
在 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 堆和 256Mb 堆栈 space。对于 length
(无限列表)的简单调用,它确实有效。
我现在的问题是:所有情况下的解决方案是什么样的? (有吗?如果没有,为什么不呢?)
编辑 #1:附加信息
- OS:Xubuntu 14.04
- 内存:4GB
- 我用于 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) ...
你的问题出在调用上。
stack ghci +RTS -M256m -K256m
Stack 不会将这些参数传递给 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
耶!争论!
我怀疑你的 +RTS ...
实际上被堆栈自己的 RTS 消耗了 - 例如,堆栈是用 Haskell 编写的,并且在你实际上希望 ghci 遵循所述约束时遵循这些约束。所以...为堆栈提交问题。
stack ghci +RTS -M256m -K256m
那不是设置 GHCi 的 RTS 选项,而是 stack
。毕竟,stack
也是写在Haskell中的,因此也可以采用RTS选项。
使用 --ghci-options
为 GHCi 提供额外的选项:
stack ghci --ghci-options="+RTS -M256m -K256m -RTS"
关闭 -RTS
是必要的,因为 stack
为 GHCi 提供了更多选项。
我已经找到 this question 及其答案。
在 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 堆和 256Mb 堆栈 space。对于 length
(无限列表)的简单调用,它确实有效。
我现在的问题是:所有情况下的解决方案是什么样的? (有吗?如果没有,为什么不呢?)
编辑 #1:附加信息
- OS:Xubuntu 14.04
- 内存:4GB
- 我用于 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) ...
你的问题出在调用上。
stack ghci +RTS -M256m -K256m
Stack 不会将这些参数传递给 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
耶!争论!
我怀疑你的 +RTS ...
实际上被堆栈自己的 RTS 消耗了 - 例如,堆栈是用 Haskell 编写的,并且在你实际上希望 ghci 遵循所述约束时遵循这些约束。所以...为堆栈提交问题。
stack ghci +RTS -M256m -K256m
那不是设置 GHCi 的 RTS 选项,而是 stack
。毕竟,stack
也是写在Haskell中的,因此也可以采用RTS选项。
使用 --ghci-options
为 GHCi 提供额外的选项:
stack ghci --ghci-options="+RTS -M256m -K256m -RTS"
关闭 -RTS
是必要的,因为 stack
为 GHCi 提供了更多选项。