5

我刚刚开始学习 Erlang,并且正在尝试一些 Project Euler 问题以开始学习。但是,我似乎能够对大序列执行任何操作而不会导致 erlang shell 崩溃。

即,即使这样:

list:seq(1,64000000).

使erlang崩溃,并出现错误:

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

实际上,字节数当然会有所不同。

现在半个 gig 是很多内存,但是一个具有 4 gigs RAM 和大量虚拟内存空间的系统应该能够处理它。

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

4

4 回答 4

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
于 2008-10-11T07:25:53.763 回答
2

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

于 2008-10-10T19:38:17.420 回答
2

此外,windows 和 linux 都对图像可以占用的最大内存量有限制我记得在 linux 上它是 0.5 GB。

真正的问题是为什么这些操作没有懒惰地完成;)

于 2008-10-10T21:11:06.670 回答
2

这是一个特点。我们不希望一个进程消耗所有内存。它就像你家的保险丝盒。为了我们大家的安全。

您必须了解 erlangs 恢复模型才能了解他们让进程终止的方式。

于 2008-10-11T16:54:00.323 回答