我刚开始学习Erlang并且正在尝试一些Project Euler问题开始。但是,我似乎能够在不破坏erlang shell的情况下对大型序列执行任何操作。
即使是这样:list:seq(1,64000000).
崩溃了erlang,错误:
eheap_alloc:无法分配467078560字节的内存(“堆”类型)。
实际上#字节数当然不同。
现在有一半的演出是一个很大的内存,但是一个拥有4 GB RAM和足够虚拟内存空间的系统应该能够处理它。
有没有办法让erlang使用更多内存?
答案 0 :(得分:12)
您的操作系统可能对用户进程的大小有默认限制。在Linux上,您可以使用ulimit更改此内容。
您可能希望迭代这些64000000个数字而不需要一次全部在内存中。使用惰性列表可以编写类似于list-all-at-once代码的代码:
-module(lazy).
-export([seq/2]).
seq(M, N) when M =< N ->
fun() -> [M | seq(M+1, N)] end;
seq(_, _) ->
fun () -> [] end.
1> Ns = lazy:seq(1, 64000000).
#Fun<lazy.0.26378159>
2> hd(Ns()).
1
3> Ns2 = tl(Ns()).
#Fun<lazy.0.26378159>
4> hd(Ns2()).
2
答案 1 :(得分:2)
可能是菜鸟回答(我是Java开发人员),但JVM人为地限制了内存量,以帮助更轻松地检测内存泄漏。也许erlang有类似的限制?
答案 2 :(得分:2)
此外,Windows和Linux都限制了图像可以占用的最大内存量 我记得在linux上它是半千兆字节。
真正的问题是为什么这些操作不会懒散地进行;)
答案 3 :(得分:2)
这是一项功能。我们不希望一个进程占用所有内存。它就像你家里的保险丝盒。为了我们所有人的安全。
你必须知道erlangs恢复模型才能理解他们让这个过程消失的方式。