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)
}

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

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

どんなアイデア、解決策、またはトリックも大歓迎です!

4

1 に答える 1

13

パッケージ からtryCatch()とを組み合わせて使用​​することで、graceful-exits-on-timout を管理できる可能性があります。同様のコードを提示し、もう少し詳細に展開しているこの投稿も参照してください。evalWithTimeout()R.utils

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"
于 2012-06-08T17:23:39.167 に答える