2010-09-22 10 views
10

Kodumu ghci kullanarak hata ayıklamak için kullanıyorum. Çoğu zaman, böyle bir şey (tabii ki, çok açık değil) olur:Hafızayı sınırlamanın bir yolu var mı?

ghci> let [email protected](_:x) = 0:1:zipWith(+)f x 
ghci> length f 

Sonra, hiçbir şey bir süre olur ve yeterince hızlı tepki yoksa, GHCi neden RAM belki 2 GB yemiş sistemim donuyor. Çok geç ise, bu sorunu çözmenin tek yolu [ALT] + [PRINT] + [K].

Soruma soru: ghci tarafından tüketilebilecek belleği sınırlamanın kolay bir yolu var mı, diyelim ki 1 GB? Limit aşılırsa, hesaplama iptal edilmeli veya ghci öldürülmelidir.

+1

Ayrıca bkz http://stackoverflow.com/questions/5716216/recovering-from-stack-overflow-or-heap-exhaustion-in-a-haskell:

ghci çıktı şimdi benziyor -program –

cevap

15

Bunu gerçekleştirmek için bir platform bağımsız yolu

ghci +RTS -M1m 

detaylar için the GHC documentation’s page on how to control the RTS (runtime system) bkz böyle Haskell çalışma zamanına seçeneği olarak -M seçeneği temin etmektir.

>ghci +RTS -M10m 
GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Loading package ffi-1.0 ... linking ... done. 
Prelude> let [email protected](_:x) = 0:1:zipWith(+)f x 
Prelude> length f 
Heap exhausted; 
Current maximum heap size is 10485760 bytes (10 MB); 
use `+RTS -M<size>' to increase it. 
+3

Sadece bir takma ad oluşturdum ghci = 'ghci + RTS -M500m -RTS' '' ~/.bashrc'' ve şimdi her şey yolunda. Çok teşekkür ederim. – fuz

+1

".ghci" dosyanızı da kullanabileceğinizi farz ediyorum. http://www.haskell.org/ghc/docs/7.2.1/html/users_guide/ghci-dot-files.html – MatrixFrog

+0

Aslında bu limitin ne zaman ulaştığı zaman iptal edilmiyor, bu yüzden bir çözüm değil. Ayrıca ghci, belirtilenden daha fazla bellek kullanmaya devam ediyor. Mesela 4Gb'lik RAM'im var, -M100m'ye ayarlıyorum. Tamamen gayet iyi olan "100Mb" ye ayarlandığını, ancak bir fib 100000 çalıştırdığımda programın hala makinemi donduğunu söylüyor.Daha önce olduğu gibi tamamen donmuyor, ancak bellek neredeyse dolu ve takas dolu oluyor, bu da çok sayıda IO'ya neden oluyor ve sistemi iki veya daha fazla dakika boyunca kullanılamaz hale getiriyor. – Zelphir

2

ulimit -m setiyle bir kabuk altında çalıştırmak oldukça kolay bir yoldur. Düzenli olarak bir sınırla çalıştırmak istiyorsanız, ghci'u çalıştırmadan önce ulimit yapan bir sarmalayıcı komut dosyası oluşturabilirsiniz.

+0

Bu işe yaramıyor. Ulimit -m 102400 gibi bir şey denedim ve hala hafızayı tüketiyor. – fuz

+0

@hobbs @FUZxxl 'ulimit -v', 'ulimit -m' kullanmalısınız. Sanalla sınırlandırmanız gerektiğinde 'm 'fiziksel belleği sınırlar: fiziksel + takas. Ben 4 GiB RAM + 5 GiB takas ile ulimit -v $ (((1024 ** 2) * 2)) '(zsh) kullanın ve sistemi donmaz. Bu, bellek miktarını 2 GiB ile sınırlar ve '~/.zshrc' veya' ~/.bashrc' içine konabilir. – ZyX

+0

Teşekkürler. Bunu daha az yararlı buluyorum, çünkü daha sonra kabuktaki değeri değiştiremiyorum. (Sadece aşağı ...) – fuz