5

Erlang の学習を始めたばかりで、プロジェクト オイラーの問題をいくつか試しています。ただし、erlang シェルをクラッシュさせることなく、大きなシーケンスに対して任意の操作を実行できるようです。

つまり、これでも:

list:seq(1,64000000).

次のエラーで erlang がクラッシュします。

eheap_alloc: 467078560 バイトのメモリ (タイプ「ヒープ」) を割り当てることができません。

実際のバイト数はもちろん異なります。

現在、半分のギグは大量のメモリですが、4 ギガの RAM と仮想メモリ用の十分なスペースを備えたシステムで処理できるはずです。

erlang により多くのメモリを使用させる方法はありますか?

4

4 に答える 4

12

OS によっては、ユーザー プロセスのサイズにデフォルトの制限がある場合があります。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
于 2008-10-11T07:25:53.763 に答える
2

また、WindowsとLinuxの両方で、イメージが占有できるメモリの最大量に制限があります。Linuxで思い出したように、それは0.5ギガバイトです。

本当の問題は、なぜこれらの操作が怠惰に行われていないのかということです;)

于 2008-10-10T21:11:06.670 に答える
2

これが特徴です。1 つのプロセスがすべてのメモリを消費することは望ましくありません。あなたの家のヒューズボックスのようなものです。私たち全員の安全のために。

プロセスを停止させる方法を理解するには、erlangs の復旧モデルを理解する必要があります。

于 2008-10-11T16:54:00.323 に答える
2

おそらく初心者の答えです(私はJava開発者です)が、JVMはメモリリークをより簡単に検出できるように人為的にメモリの量を制限します。おそらくerlangにも同様の制限がありますか?

于 2008-10-10T19:38:17.420 に答える