为什么 Erlang 在处理大型序列时会崩溃?

发布于 2024-07-08 04:39:30 字数 354 浏览 4 评论 0原文

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

即,即使这样:

list:seq(1,64000000).

erlang崩溃,并出现错误:

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

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

现在,半 GB 已经是很大的内存了,但是具有 4 GB RAM 和足够虚拟内存空间的系统应该能够处理它。

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

I have just started learning Erlang and am trying out some Project Euler problems to get started. However, I seem to be able to do any operations on large sequences without crashing the erlang shell.

Ie.,even this:

list:seq(1,64000000).

crashes erlang, with the error:

eheap_alloc: Cannot allocate 467078560 bytes of memory (of type "heap").

Actually # of bytes varies of course.

Now half a gig is a lot of memory, but a system with 4 gigs of RAM and plenty of space for virtual memory should be able to handle it.

Is there a way to let erlang use more memory?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

征﹌骨岁月お 2024-07-15 04:39:30

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

Your OS may have a default limit on the size of a user process. On Linux you can change this with ulimit.

You probably want to iterate over these 64000000 numbers without needing them all in memory at once. Lazy lists let you write code similar in style to the list-all-at-once code:

-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
过去的过去 2024-07-15 04:39:30

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

Possibly a noob answer (I'm a Java dev), but the JVM artificially limits the amount of memory to help detect memory leaks more easily. Perhaps erlang has similar restrictions in place?

じее 2024-07-15 04:39:30

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

你必须了解 erlangs 恢复模型才能理解他们让进程死掉的方式。

This is a feature. We do not want one processes to consume all memory. It like the fuse box in your house. For the safety of us all.

You have to know erlangs recovery model to understand way they let the process just die.

美煞众生 2024-07-15 04:39:30

另外,windows和linux都对图像可以占用的最大内存量有限制
我记得在 Linux 上它是半千兆字节。

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

Also, both windows and linux have limits on the maximum amount of memory an image can occupy
As I recall on linux it is half a gigabyte.

The real question is why these operations aren't being done lazily ;)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文