2012-06-08 11 views
12

いくつかの努力のために、私は現時点で関与しており、一連の機能を通じて多数のパラメータの組み合わせで大規模なデータセットを実行しています。これらの関数には、クラスター上での操作を容易にするためのラッパー(mclapply)があります。しかし、私は2つの大きな課題に直面しています。リストアイテムが失敗したり長すぎたりすると、どのようにタイムアウトするのですか?

a)パラメータの組み合わせが大きい(20k〜100kと思う)。時には特定の組み合わせになります(例えば、生存率が高すぎ、死亡率が低すぎるため、モデルは仮想シナリオとして収束しません)。どんな組み合わせが失敗するかを正確に早めに突き止めることは難しい(私がそれをやることができればもっと楽になるだろう)。しかし、今の私は、セットアップのこのタイプを持っている:

failsafe <- failwith(NULL, my_wrapper_function) 
# This is what I run 
# Note that input_variables contains a list of variables in each list item 
results <- mclapply(input_variables, failsafe, mc.cores = 72) 
# On my local dual core mac, I can't do this so the equivalent would be: 
results <- llply(input_variables, failsafe, .progress = 'text') 

私のラッパー関数のスケルトンは次のようになります。

my_wrapper_function <- function(tlist) { 
    run <- tryCatch(my_model(tlist$a, tlist$b, tlist$sA, tlist$Fec, m = NULL) , error=function(e) NULL) 
... 
return(run) 
} 

は、これが最も効率的なアプローチですか?何らかの理由で特定の変数の組み合わせがモデルをクラッシュさせた場合は、NULLを返して残りの部分を実行する必要があります。しかし、私はまだそれが優雅により少なく失敗するという問題があります。

b)ある入力の組み合わせがでない場合、はモデルをクラッシュさせますが、収束には時間がかかりすぎることがあります。クラスターの計算時間に制限を設けて(例えば6時間)、私は何かのために自分のリソースを浪費しません。関数呼び出しが1つのリスト項目に対してx時間以上かかる場合は、その項目が移動するようなタイムアウトを含めるにはどうすればよいですか?時間を計算するのは簡単ですが、シミュレーション中の関数を中断して時間をチェックすることはできません。

アイデア、解決策またはトリックはありがとう!

+1

あなたはsetTimeLimit()またはhttp://www.inside-r.org/node/81211を調べましたか?あなたが必要とするものかもしれません。 – frankc

答えて

12

R.utilsパッケージのtryCatch()evalWithTimeout()の組み合わせを使用して、graceful-exit-tim-timoutを管理できます。類似のコードを提示する See also this postは、もう少し詳しく解説しています。

require(R.utils) 

myFun <- function(x) {Sys.sleep(x); x^2} 

## evalWithTimeout() times out evaluation after 3.1 seconds, and then 
## tryCatch() handles the resulting error (of class "TimeoutException") with 
## grace and aplomb. 
myWrapperFunction <- function(i) { 
    tryCatch(expr = evalWithTimeout(myFun(i), timeout = 3.1), 
      TimeoutException = function(ex) "TimedOut") 
} 

sapply(1:5, myWrapperFunction) 
# [1] "1"  "4"  "9"  "TimedOut" "TimedOut" 
+0

ありがとう、ジョシュ。私は今、私のクラスターでこれをテストしています(ローカルでうまく動作しますが、タイムアウトがクラスター上でうまくいくかどうかは分かりません)。 – Maiasaura

関連する問題