5 Stimmen

Warum stürzt Erlang bei großen Sequenzen ab?

Ich habe gerade angefangen, Erlang zu lernen und probiere einige Project Euler Probleme aus, um anzufangen. Allerdings scheine ich keine Operationen auf großen Sequenzen ohne Absturz der Erlang-Shell durchführen zu können.

Das heißt, selbst das:

list:seq(1,64000000).

stürzt Erlang ab, mit dem Fehler:

eheap_alloc: Kann 467078560 Bytes Speicher (vom Typ "heap") nicht zuweisen.

Eigentlich variiert die Anzahl der Bytes natürlich.

Jetzt halbe Gigabyte ist eine Menge Speicher, aber ein System mit 4 Gigabyte RAM und viel Platz für virtuellen Speicher sollte damit umgehen können.

Gibt es einen Weg, damit Erlang mehr Speicher verwenden kann?

0 Stimmen

Die Leute in der Mailingliste erlang-questions (siehe erlang.org/faq.html ) können Ihnen auf jeden Fall helfen.

0 Stimmen

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

12voto

Darius Bacon Punkte 14645

Ihr Betriebssystem hat möglicherweise ein Standardlimit für die Größe eines Benutzerprozesses. Auf Linux können Sie dies mit ulimit ändern.

Sie möchten wahrscheinlich über diese 64000000 Zahlen iterieren, ohne sie alle gleichzeitig im Speicher haben zu müssen. Mit Lazy-Listen können Sie Code schreiben, der dem Code ähnlich ist, den Sie alle auf einmal haben:

-Modul (lazy).
-Exportieren([seq/2]).

seq(M, N) wenn M =< N ->
    fun() -> [M | seq(M+1, N)] end;
seq(_, _) ->
    fun () -> [] end.

1> Ns = lazy:seq(1, 64000000).
#Fun
2> hd(Ns()).
1
3> Ns2 = tl(Ns()).
#Fun
4> hd(Ns2()).
2

2voto

Draemon Punkte 32703

Möglicherweise eine Anfängerantwort (ich bin ein Java-Entwickler), aber die JVM begrenzt künstlich die Speichermenge, um das Erkennen von Speicherlecks zu erleichtern. Vielleicht hat Erlang ähnliche Beschränkungen?

2voto

Marcin Punkte 46457

Außerdem haben sowohl Windows als auch Linux Grenzen für die maximale Menge an Speicher, die ein Bild einnehmen kann Soweit ich mich erinnere, sind es auf Linux eine halbe Gigabyte.

Die eigentliche Frage ist, warum diese Operationen nicht faul gemacht werden ;)

2voto

FlinkmanSV Punkte 17684

Dies ist eine Funktion. Wir wollen nicht, dass ein Prozess den gesamten Speicher verbraucht. Es ist wie die Sicherungskasten in Ihrem Haus. Zum Schutz von uns allen.

Sie müssen das Wiederherstellungsmodell von Erlang kennen, um zu verstehen, warum sie den Prozess einfach sterben lassen.

0 Stimmen

Meinen Sie mit Prozess die gesamte Erlang-VM oder lediglich den leichten Prozess für jede gleichzeitige Routine? Wenn eine Routine viel Speicher benötigt, stirbt nur sie selbst oder führt sie zum Absturz der gesamten Erlang-VM?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X