memory - 为什么 Erlang 会在大序列上崩溃?

标签 memory memory-management erlang

我刚刚开始学习 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/

相关文章:

c - 内存寻址和指针

windows - 任何限制物理内存使用的方法? (页面文件OK)

c - 无法从函数中释放指针

c++ - 在静态成员分配之前调用函数

erlang - ebin 中的雅司病和 erlang 梁文件

architecture - 使用 Erlang/OTP 构建容错软实时 Web 应用程序

macos - 如何在 Mac OSX 上检查 Matlab 2010b 或更高版本中的可用内存?

c++ - linux 中的 force kill 命令 (kill -9) 是否会在 C++ 应用程序中使用 new 运算符清理动态分配的内存?

linux - Linux 中的内存请求

erlang - Erlang 中的参数化模块有哪些替代方案?