2008-10-10 47 views
5

我刚开始学习Erlang,并尝试了一些Project Euler问题来开始。但是,我似乎能够在不崩溃erlang外壳的情况下对大型序列执行任何操作。Erlang为什么会在大序列上崩溃?

即,即使这样的:

list:seq(1,64000000). 

崩溃二郎,与错误:

eheap_alloc:无法分配467078560个字节(类型 “堆”)存储器。

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

现在有一半的演出是大量的内存,但一个具有4个内存和大量虚拟内存的系统应该能够处理它。

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

+0

erlang-questions邮件列表中的人员(请参阅http://www.erlang.org/faq.html)绝对可以帮助您。 – JesperE 2008-10-10 19:29:46

回答

12

您的操作系统可能对用户进程的大小默认限制。在Linux上,你可以用ulimit来改变它。

您可能希望遍历这些64000000数字,而不需要将它们全部存储在内存中。懒惰列表可让您编写与列表全部一次性代码类似的代码:

-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 
2

可能是noob answer(我是Java开发人员),但是JVM人为地限制了内存量,以帮助更轻松地检测内存泄漏。也许erlang有类似的限制吗?

2

此外,Windows和Linux都对图像占用的最大内存量有限制 正如我在Linux上回想起的那样,它是半个千兆字节。

真正的问题是,为什么这些操作不被懒洋洋地做;)

2

这是一项功能。我们不希望一个进程占用所有内存。它就像你家里的保险丝盒。为了我们所有人的安全。

你必须知道erlangs恢复模型,以了解它们让进程死掉的方式。