我刚刚开始学习Erlang并且正在尝试一些Project Euler问题开始.但是,我似乎能够在不破坏erlang shell的情况下对大型序列进行任何操作.
即使是这样:
list:seq(1,64000000).
崩溃erlang,错误:
eheap_alloc:无法分配467078560字节的内存("堆"类型).
实际上#字节数当然不同.
现在,半场演出是一个很大的内存,但是一个拥有4 GB 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). #Fun2> hd(Ns()). 1 3> Ns2 = tl(Ns()). #Fun 4> hd(Ns2()). 2