2008-10-10 4 views
5

Je viens de commencer à apprendre Erlang et j'essaie de résoudre certains problèmes de Project Euler. Cependant, il semble que je sois capable de faire des opérations sur de grandes séquences sans écraser le shell erlang.Pourquoi Erlang plante-t-il sur de grandes séquences?

Ie, même ceci:.

list:seq(1,64000000). 

s'écrase Erlang, avec l'erreur:

eheap_alloc: ne peut pas allouer 467078560 octets de mémoire (de type "tas").

En fait, le nombre d'octets varie bien sûr.

Maintenant, un demi-concert est beaucoup de mémoire, mais un système avec 4 Go de RAM et beaucoup d'espace pour la mémoire virtuelle devrait être capable de le gérer.

Y at-il un moyen de laisser Erlang utiliser plus de mémoire?

+0

Les personnes sur la liste de diffusion erlang-questions (voir http://www.erlang.org/faq.html) peuvent certainement vous aider. – JesperE

+0

Erlang a un sérieux problème de mémoire. Les messages sont copiés et la VM peut tomber à n'importe quel moment. Cochez cette question et ses réponses: http://stackoverflow.com/q/7103621/431620 –

Répondre

12

Votre système d'exploitation peut avoir une limite par défaut de la taille d'un processus utilisateur. Sous Linux, vous pouvez changer cela avec ulimit.

Vous souhaitez probablement parcourir ces 64000000 numéros sans les avoir tous en mémoire à la fois. Lazy listes vous permettent d'écrire un code similaire dans le style à la liste-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 
2

Peut-être une réponse noob (je suis un développeur Java), mais la JVM limite artificiellement la quantité de mémoire pour aider à détecter les fuites de mémoire plus facilement. Peut-être que erlang a des restrictions similaires en place?

2

En outre, les fenêtres et Linux ont des limites sur la quantité maximale de mémoire qu'une image peut occuper Comme je me souviens sur Linux, il est d'un demi-gigaoctet.

La question est de savoir pourquoi ces opérations ne sont pas fait paresseusement;)

2

Ceci est une caractéristique. Nous ne voulons pas qu'un processus consomme toute la mémoire. C'est comme la boîte à fusibles dans votre maison. Pour la sécurité de nous tous.

Vous devez connaître le modèle de récupération erlangs pour comprendre comment ils ont laissé mourir le processus.