为什么Erlang会在大型序列上崩溃?

时间:2008-10-10 19:22:46

标签: memory memory-management erlang

我刚开始学习Erlang并且正在尝试一些Project Euler问题开始。但是,我似乎能够在不破坏erlang shell的情况下对大型序列执行任何操作。

即使是这样:

list:seq(1,64000000).

崩溃了erlang,错误:

eheap_alloc:无法分配467078560字节的内存(“堆”类型)。

实际上#字节数当然不同。

现在有一半的演出是一个很大的内存,但是一个拥有4 GB RAM和足够虚拟内存空间的系统应该能够处理它。

有没有办法让erlang使用更多内存?

4 个答案:

答案 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恢复模型才能理解他们让这个过程消失的方式。