2008-10-10 20 views
5

Erlang'ı öğrenmeye yeni başladım ve bazı Project Euler problemlerini denemeye başladım. Bununla birlikte, erlang kabuğunu çarpmadan büyük dizilerde herhangi bir işlem yapabilmem mümkün görünüyor.Erlang neden büyük dizilerde çöküyor?

Yani, hatta bu:.

list:seq(1,64000000). 

hatasıyla, erlang çöküyor:

eheap_alloc: ("yığın" türü) bellek 467078560 bayt ayrılamıyor.

Aslında bayt sayısı elbette değişir.

Şimdi bir konser yarım bir bellek, ancak 4 gig RAM ve sanal bellek için yeterli alana sahip bir sistem onu ​​idare edebilmelidir.

Erlang'ın daha fazla bellek kullanmasına izin vermenin bir yolu var mı?

+0

Erlang-sorular posta listesindeki kişiler (bkz. Http://www.erlang.org/faq.html) kesinlikle size yardımcı olabilir. – JesperE

+0

Erlang ciddi bir bellek sorunuyla geliyor. Mesajlar kopyalanır ve Sanal Makine her zaman gidebilir. Bu soruyu ve cevaplarını kontrol edin: http://stackoverflow.com/q/7103621/431620 –

cevap

12

Sizin OS kullanıcı işlemi boyutuna varsayılan bir sınır olabilir. Linux'ta bunu ulimit ile değiştirebilirsiniz.

Bu 64000000 sayıyı, hepsini aynı anda belleğe eklemeden yinelemek isteyebilirsiniz. Tembel listeler, bir kerelik liste koduna benzer tarzda kod yazmanıza izin verir:

-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

Muhtemelen bir noob yanıtı (Java devresiyim), ancak JVM bellek sızıntılarını daha kolay algılamaya yardımcı olmak için bellek miktarını yapay olarak sınırlar. Belki de erlang benzer kısıtlamalara sahiptir?

2

Ayrıca, hem windows hem de linux, bir resmin kaplayabileceği maksimum bellek miktarını sınırlar. Linux'i hatırladığım gibi, yarım gigabayt.

bu operasyonlar tembel yapılıyor değil neden gerçek soru

;)

2

Bu bir özelliktir. Bir işlemin tüm belleği tüketmesini istemiyoruz. Evindeki sigorta kutusunu sevdim. Hepimizin güvenliği için.

Erlangs kurtarma modelini bilmeniz, işlemin bitmesine izin vermelerini anlamak için.