2008-10-10 9 views
5

Ich habe gerade Erlang gelernt und probiere einige Project Euler Probleme aus, um loszulegen. Ich scheine jedoch in der Lage zu sein, Operationen an großen Sequenzen auszuführen, ohne die Erlang-Shell zu zerstören.Warum stürzt Erlang auf große Sequenzen?

Ie, auch dies:.

list:seq(1,64000000). 

abstürzt erlang, mit dem Fehler:

eheap_alloc: kann (vom Typ "heap") nicht 467.078.560 Byte Speicher zuzuteilen.

Tatsächlich variiert die Anzahl der Bytes natürlich.

Jetzt ein halbes Gig ist viel Speicher, aber ein System mit 4 GB RAM und viel Platz für virtuellen Speicher sollte damit umgehen können.

Gibt es eine Möglichkeit, dass Erlang mehr Speicher verwendet?

+0

Die Leute auf der Erlang-Fragen-Mailingliste (siehe http://www.erlang.org/faq.html) können Ihnen definitiv helfen. – JesperE

+0

Erlang hat ein ernstes Speicherproblem. Nachrichten werden kopiert und die VM kann jederzeit heruntergefahren werden. Überprüfen Sie diese Frage und ihre Antworten: http://stackoverflow.com/q/7103621/431620 –

Antwort

12

Ihr Betriebssystem eine Standard Grenze für die Größe eines Benutzerprozesses haben kann. Unter Linux können Sie dies mit ulimit ändern.

Sie möchten wahrscheinlich über diese 64000000 Zahlen iterieren, ohne sie alle im Speicher auf einmal zu benötigen. Lazy Listen können Sie Code ähnlich in der Art der Liste-all-at-once-Code schreiben:

-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

Möglicherweise eine Noob-Antwort (ich bin ein Java-Entwickler), aber die JVM begrenzt künstlich die Menge an Speicher, um Speicherlecks leichter zu erkennen. Vielleicht hat erlang ähnliche Einschränkungen?

2

Auch haben beide Windows und Linux Grenzen auf die maximale Menge an Speicher, die ein Bild belegen kann Wie ich mich erinnere auf Linux ist es ein halbes Gigabyte.

Die eigentliche Frage ist, warum diese Operationen träge nicht getan werden;)

2

Dies ist ein Feature. Wir wollen nicht, dass ein Prozess den gesamten Speicher verbraucht. Es ist wie der Sicherungskasten in Ihrem Haus. Für die Sicherheit von uns allen.

Sie müssen Erlangs Wiederherstellungsmodell wissen, wie sie den Prozess einfach sterben lassen.

Verwandte Themen