我刚刚开始学习 Erlang 并且正在尝试一些 Project Euler 问题以开始使用。但是,我似乎能够对大序列进行任何操作而不会导致 erlang shell 崩溃。
即,即使是这样:
list:seq(1,64000000).
崩溃erlang,出现错误:
eheap_alloc:无法分配 467078560 字节的内存(“堆”类型)。
实际上,字节数当然会有所不同。
现在半个 gig 是很多内存,但是具有 4 gig 的 RAM 和大量虚拟内存空间的系统应该能够处理它。
有没有办法让erlang使用更多的内存?
最佳答案
您的操作系统可能对用户进程的大小有默认限制。在 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
关于memory - 为什么 Erlang 会在大序列上崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/192725/