Почему Erlang падает на больших последовательностях? - PullRequest
5 голосов
/ 10 октября 2008

Я только начал изучать Erlang и пробую некоторые проблемы Project Euler, чтобы начать. Однако мне кажется, что я могу выполнять любые операции над большими последовательностями, не разбивая оболочку erlang.

Т.е. даже это:

list:seq(1,64000000).

вылетает erlang, с ошибкой:

eheap_alloc: Невозможно выделить 467078560 байт памяти (типа «куча»).

На самом деле количество байтов, конечно, меняется.

Теперь половина гигабайта - это много памяти, но система с 4 гигабайтами оперативной памяти и большим количеством места для виртуальной памяти должна справиться с этим.

Есть ли способ позволить Эрлангу использовать больше памяти?

Ответы [ 4 ]

12 голосов
/ 11 октября 2008

Ваша ОС может иметь ограничение по умолчанию на размер пользовательского процесса. В 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 голосов
/ 11 октября 2008

Это особенность. Мы не хотим, чтобы один процесс занимал всю память. Это как блок предохранителей в вашем доме. Для безопасности всех нас.

Вы должны знать модель восстановления erlangs, чтобы понять, как они позволяют процессу просто умереть.

2 голосов
/ 11 октября 2008

Кроме того, и Windows, и Linux имеют ограничения на максимальный объем памяти, который может занимать изображение Насколько я помню на Linux это пол гигабайта.

Реальный вопрос в том, почему эти операции не выполняются лениво;)

2 голосов
/ 10 октября 2008

Возможно, ответ noob (я - Java-разработчик), но JVM искусственно ограничивает объем памяти, чтобы легче обнаруживать утечки памяти. Возможно, у Эрланга есть подобные ограничения?

...