2010-09-22 4 views
10

Ich bin es gewohnt, meinen Code mit ghci zu debuggen. Oft, so etwas wie dies geschieht (nicht so offensichtlich, natürlich):Gibt es eine Möglichkeit, den Speicher zu begrenzen, den ghci haben kann?

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

Dann passiert nichts für einige Zeit, und wenn ich nicht schnell genug reagieren, hat GHCI vielleicht 2 GB RAM gegessen, was mein System einzufrieren. Wenn es zu spät ist, können Sie das Problem nur lösen, indem Sie [ALT] + [DRUCKEN] + [K] drücken.

Meine Frage: Gibt es eine einfache Möglichkeit, den Speicher zu begrenzen, der von Ghci verbraucht werden kann, sagen wir 1 GB? Wenn das Limit überschritten wird, sollte die Berechnung abgebrochen werden oder ghci sollte getötet werden.

+1

Siehe auch http://stackoverflow.com/questions/5716216/recovering-from-stack-overflow-or-heap-exhaustion-in-a-haskell -Programm –

Antwort

15

Ein plattformunabhängig Weg dies zu tun ist, um die -M Option auf Option zur Haskell Laufzeit, wie dies für Details

ghci +RTS -M1m 

siehe the GHC documentation’s page on how to control the RTS (runtime system) zu liefern.

Die ghci Ausgabe sieht nun wie:

>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

Ich habe gerade einen Alias ​​'alias ghci = 'ghci + RTS -M500m -RTS' in' ~/.bashrc' erstellt und alles ist in Ordnung. Vielen Dank. – fuz

+1

Ich nehme an, du könntest auch deine '.ghci' Datei benutzen? http://www.haskell.org/ghc/docs/7.2.1/html/users_guide/ghci-dot-files.html – MatrixFrog

+0

Eigentlich bricht dies nicht ab, wenn das Limit erreicht ist, also ist es keine Lösung. Außerdem verwendet ghci immer mehr Speicher als angegeben. Zum Beispiel habe ich '4Gb' von RAM, ich setze es auf' -M100m'. Es sagt mir, dass es auf '100Mb' eingestellt ist, was völlig in Ordnung ist, aber wenn ich eine' fib 100000' starte, friert das Programm immer noch fast mein Rechner ein.Es friert es nicht wie zuvor vollständig ein, aber der Speicher ist fast voll und der Swap wird gefüllt, was eine Menge IO verursacht, wodurch das System für zwei oder mehr Minuten unbrauchbar wird. – Zelphir

2

Führen Sie es unter einer Shell mit ulimit -m Set ist ein ziemlich einfacher Weg. Wenn Sie regelmäßig mit einem Limit arbeiten möchten, können Sie vor dem Ausführen von ghci ein Wrapper-Skript erstellen, das ulimit ausführt.

+0

Das funktioniert nicht. Ich habe versucht, etwas wie "ulimit -m 102400" und es verbraucht immer noch Speicher. – fuz

+0

@hobbs @ FUZxxl sollten Sie 'ulimit -v', nicht' ulimit -m' verwenden. '-m' Schalter begrenzt physischen Speicher, während Sie virtuell begrenzen müssen: physisch + swap. Ich benutze 'ulimit -v $ (((1024 ** 2) * 2)) (zsh) mit 4 GiB RAM + 5 GiB Swap und es friert das System nicht ein. Dies begrenzt die Speichermenge auf 2 GiB und kann in '~/.zshrc' oder' ~/.bashrc' gesetzt werden. – ZyX

+0

Danke. Ich finde das weniger hilfreich, da ich den Wert in der Shell danach nicht mehr ändern kann. (Nur runter ...) – fuz