2012-05-27 17 views
8

Gibt es eine Möglichkeit in Haskell (mit GHC, wenn es darauf ankommt, für Code, der unter Linux und Windows ausgeführt werden muss), beschränkte Berechnungen durchzuführen? Das heißt, "berechne das Ergebnis dieser Funktion, wenn es machbar ist, aber wenn der Versuch mehr als X CPU-Zyklen, Y-Stapelspeicher oder Z-Stapelspeicherplatz verwendet hat und immer noch nicht beendet ist, halte an und gebe einen Hinweis darauf zurück war es nicht möglich, die Berechnung abzuschließen "?Begrenzte Berechnung in Haskell

+0

Bauen Sie ein Modellprüfwerkzeug? –

+0

Unter anderem ja. – rwallace

+0

Das könnte auch von Interesse sein: http://hackage.haskell.org/package/speculation – jberryman

Antwort

8
+0

Danke! Das sieht definitiv wie die Antwort für begrenzte Zeit aus. Wenn Sie diesen Teil der Dokumentation durchsehen, scheint es keine ähnliche Lösung für das Gedächtnis zu geben. – rwallace

+2

In der Tat. Ich kann mir keine vernünftige Semantik für das Gedächtnis vorstellen, obwohl - neben der extremen Schwierigkeit, den Speicherverbrauch präzise zu messen, was ist, wenn es einen anderen Thread gibt, der nicht durch den Speicher eingeschränkt ist? Was passiert, wenn Sie einige Werte mit diesem anderen Thread teilen? wer "zahlt dafür"? Wie lösen Sie diese Probleme schnell genug, um Messungen zu erhalten, ohne die Funktion zu lähmen, die ausgeführt wird? –

+0

Ja, das sind harte Probleme und ehrlich gesagt war ich nicht optimistisch in Bezug auf die Wahrscheinlichkeit, dass eine Mehrzwecksprache eine Standardlösung bietet, aber ich fand, dass es einen Versuch wert war, bevor ich mich mit meiner eigenen Speicherverwaltung hackte in C++ :-) – rwallace

6

Hier ist eine hackish Lösung Sie konnte try: laichen Ihre Berechnung mit forkIO, und lassen Sie die Muttergewinde (oder einen Monitor-Thread, der den Zugriff auf die gegabelten Thread ThreadId hat) in regelmäßigen Abständen abfragen jede Menge, die Sie wollen, und werfen Sie eine asynchrone Ausnahme auf den Computer-Thread wie nötig (interessanterweise, genau das ist, wie timeout funktioniert.)

Die nächste Frage wäre, ob die Es ist eine Möglichkeit herauszufinden, wie groß der Heap derzeit in Haskell ist. Gesamtspeicherverbrauch und Zyklen können Sie herausfinden, indem Sie Shell-Befehle erzeugen oder das Betriebssystem auf andere Weise abfragen (ich würde nicht wissen, wie das unter Windows funktioniert).

Es ist keine perfekte Lösung, aber es ist einfach , die Sie in wenigen Minuten implementieren und testen können.

+0

Ich war auf der Suche nach einer Speicher-in-Verwendung-Methode, konnte aber keine in Haskell finden. –

+0

Anstatt die Heap-Verwendung des Forks zu überwachen, können Sie auch einfach den Heap mit 'RTS'opts begrenzen, oder? – leftaroundabout

+0

'ForkIO' ist im selben Haskell-Programm. Wenn Sie keinen neuen Prozess generieren, arbeiten Sie innerhalb des freigegebenen Heapspeichers. –

6

Auf Prozess-Ebene können Sie GHC's RTS options verwenden, um maximale Stack- und Heap-Größen zu steuern.