Frage

Ich bin zu debuggen meinen Code mit GHCI verwendet. Oft, so etwas wie dies geschieht (nicht so offensichtlich, natürlich):

ghci> let f@(_: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 gegessen vielleicht 2 GB RAM, so dass mein System einzufrieren. Wenn es zu spät ist, ist der einzige Weg, um dieses Problem zu lösen, ist [ALT] + [PRINT] + [K].

Meine Frage: Gibt es einen einfachen Weg, um den Speicher zu begrenzen, die durch GHCI verzehrt werden können, sagen wir mal 1 GB? Wenn Grenze überschreitet, soll die Berechnung abgebrochen habe oder GHCI soll getötet werden.

War es hilfreich?

Lösung

Ein plattformunabhängig Weg dies zu tun ist, um die -M Option auf Option auf die Haskell Laufzeit wie diese

liefern
ghci +RTS -M1m

finden Sie unter der Seite des GHC Dokumentation, wie den RTS (Runtime-System) für Details zu steuern.

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 f@(_: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.

Andere Tipps

es unter einer Schale mit ulimit -m Satz Laufen ist eine ziemlich einfache Art und Weise. Wenn Sie mit einer gewissen Grenze auf einer regelmäßigen Basis ausführen möchten, können Sie ein Wrapper-Skript erstellen, die ulimit tut vor ghci ausgeführt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top