8

Haskell (Linux と Windows で実行する必要があるコードの場合、問題があれば GHC を使用) で制限付き計算を実行する方法はありますか? つまり、「実行可能な場合はこの関数の結果を計算しますが、試行が X CPU サイクル、Y スタック空間、または Z ヒープ空間を超えて使用し、それでもまだ完了していない場合は、停止して、それが実行されたことを示す指示を返します。計算を完了できませんでした」?

4

3 に答える 3

8
System.Timeout.timeout :: Int -> IO a -> IO (Maybe a)

http://lambda.haskell.org/hp-tmp/docs/2011.2.0.0/ghc-doc/libraries/base-4.3.1.0/System-Timeout.html#v:timeout

于 2012-05-27T07:06:36.710 に答える
6

試すことができるハックな解決策は次のとおりです。で計算を生成しforkIO、親スレッド(またはフォークされたスレッドにアクセスできる監視スレッドThreadId)に必要な量を定期的にポーリングさせ、コンピューティングスレッドに非同期例外をスローします必要に応じて(興味深いことに、それがまさにそのtimeout仕組みです)。

次の質問は、Haskell内から現在のヒープの大きさを調べる方法があるかどうかです。シェルコマンドを生成するか、別の方法でOSにクエリを実行することで確認できる合計メモリ消費量とサイクル(Windowsでそれを行う方法がわかりません)。

これは完璧なソリューションではありませんが、数分で実装およびテストできる単純なソリューションです。

于 2012-05-27T09:30:57.787 に答える
6

プロセスごとのレベルでは、GHCのRTSオプションを使用して、最大スタックおよびヒープサイズを制御できます。

于 2012-05-27T14:46:07.923 に答える