2008-10-10 12 views
5

Acabo de empezar a aprender Erlang y estoy probando algunos problemas de Project Euler para comenzar. Sin embargo, parezco poder hacer cualquier operación en secuencias grandes sin estrellar el shell erlang.¿Por qué Erlang se cuelga en secuencias grandes?

Ie, incluso esta:.

list:seq(1,64000000). 

se bloquea erlang, con el error:

eheap_alloc: No se puede asignar 467078560 bytes de memoria (de tipo "montón").

Actualmente, el número de bytes varía, por supuesto.

Ahora la mitad de un concierto es una gran cantidad de memoria, sino un sistema con 4 gigas de RAM y un montón de espacio para la memoria virtual debe ser capaz de manejar la situación.

¿Hay una manera de dejar Erlang utilizan más memoria?

+0

la gente en la lista de preguntas de Erlang (véase http://www.erlang.org/faq.html) de distribución que sin duda puede ayudar. – JesperE

+0

Erlang tiene un serio problema de memoria. Los mensajes se copian y la VM puede desactivarse en cualquier momento. Verifique esta pregunta y sus respuestas: http://stackoverflow.com/q/7103621/431620 –

Respuesta

12

Su sistema operativo puede tener un límite predeterminado del tamaño de un proceso de usuario. En Linux puedes cambiar esto con ulimit.

es probable que desee para repetir estos números 64000000 sin necesidad de todos ellos en la memoria a la vez. listas perezosas permiten escribir código similar en estilo a la lista todas a la vez código:

-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

Posiblemente una respuesta novato (soy un desarrollador de Java), pero la JVM limita artificialmente la cantidad de memoria para ayudar a detectar pérdidas de memoria con mayor facilidad. Quizás Erlang tiene restricciones similares en su lugar?

2

Además, tanto Windows como Linux tienen límites en la cantidad máxima de memoria que una imagen puede ocupar Como recuerdo en Linux, es medio gigabyte.

La verdadera pregunta es por qué estas operaciones no se están haciendo con pereza;)

2

Ésta es una característica. No queremos que un proceso consuma toda la memoria. Me gusta la caja de fusibles en tu casa. Por la seguridad de todos nosotros

usted tiene que saber erlangs modelo de recuperación de entender manera que permiten el proceso acaba de morir.

Cuestiones relacionadas