代码之家  ›  专栏  ›  技术社区  ›  Dana

为什么二郎在大序列上崩溃?

  •  5
  • Dana  · 技术社区  · 16 年前

    我刚刚开始学习二郎,正在尝试一些项目欧拉问题开始。但是,我似乎能够在不破坏二郎壳的情况下对大型序列执行任何操作。

    即使是这样:

    list:seq(1,64000000).
    

    崩溃Erlang,错误为:

    eheap ou alloc:无法分配467078560字节的内存(类型为“heap”)。

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

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

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

    4 回复  |  直到 10 年前
        1
  •  12
  •   Darius Bacon    16 年前

    您的操作系统可能对用户进程的大小有默认限制。在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
  •  2
  •   Draemon    16 年前

    可能是NoOB回答(我是Java DEV),但是JVM人为地限制了内存量,以帮助更容易地检测内存泄漏。也许二郎也有类似的限制?

        3
  •  2
  •   Flinkman    16 年前

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

    您必须了解Erlangs恢复模型,以了解它们让流程死掉的方式。

        4
  •  2
  •   Marcin    16 年前

    此外,Windows和Linux都限制了映像可以占用的最大内存量。 我记得在Linux上,它只有半个千兆字节。

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