2017-03-27 6 views
1

私はこの奇妙なsegfaultエラーに遭遇しました。私はマルコフ連鎖モンテカルロアルゴリズム(分布に近似する逐次アルゴリズム)を実行していました。私はこのアルゴリズムの各1回の反復を並列化します。だから、今、奇妙なことは、私のデータセットのサイズが比較的緩やかであるとき、アルゴリズムは問題なく実行することができますですLinuxでmclapplyを使用しているときにRで奇妙なsegfaultが発生する

for (iter in 1:T){ 
    res[iter] = mclapply(fun) 
} 

のようなものです。次に、データセットのサイズを増やし(超大型ではなく80,000回の観測)、アルゴリズムは最初の1000回の反復で機能し、その後segfaultエラーで停止します。私はエラー以下貼り付けています:

*** caught segfault *** 
address 0x20, cause 'memory not mapped' 

Traceback: 
1: mcfork() 
2: FUN(X[[i]], ...) 
3: lapply(seq_len(cores), inner.do) 
4: mclapply(1:n, FUN = function(k) { return(OptimRE(dataSummaries[[k]], mu + beta, v, vre))}, mc.cores = ncores) 
5: getMargLikelihood0(dataSummaries_layer1[[k]], mu, v, vre, beta[k], logarithm = TRUE) 
6: FUN(X[[i]], ...) 
7: lapply(X = S, FUN = FUN, ...) 
8: doTryCatch(return(expr), name, parentenv, handler) 
9: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 
10: tryCatchList(expr, classes, parentenv, handlers) 
11: tryCatch(expr, error = function(e) { call <- conditionCall(e) if (!is.null(call)) {  if (identical(call[[1L]], quote(doTryCatch)))    call <- sys.call(-4L)  dcall <- deparse(call)[1L]  prefix <- paste("Error in", dcall, ": ") LONG <- 75L  msg <- conditionMessage(e)  sm <- strsplit(msg, "\n")[[1L]]  w <- 14L + nchar(dcall, type = "w") + nchar(sm[1L], type = "w")  if (is.na(w))    w <- 14L + nchar(dcall, type = "b") + nchar(sm[1L],     type = "b") if (w > LONG)    prefix <- paste0(prefix, "\n ") } else prefix <- "Error : " msg <- paste0(prefix, conditionMessage(e), "\n") .Internal(seterrmessage(msg[1L])) if (!silent && identical(getOption("show.error.messages"),  TRUE)) { cat(msg, file = stderr())  .Internal(printDeferredWarnings()) } invisible(structure(msg, class = "try-error", condition = e))}) 
12: try(lapply(X = S, FUN = FUN, ...), silent = TRUE) 
13: sendMaster(try(lapply(X = S, FUN = FUN, ...), silent = TRUE)) 
14: FUN(X[[i]], ...) 
15: lapply(seq_len(cores), inner.do) 
16: mclapply(1:length(beta), FUN = function(k) { return(getMargLikelihood0(dataSummaries_layer1[[k]], mu,   v, vre, beta[k], logarithm = TRUE))}, mc.cores = ncores) 
17: getMargLikelihood(dataSummaries_layer1, newm, news, newv, beta1) 
18: FitPoissRegNRE(my[j, ], groupid, id1, id2, nb = nb, nc = nc,  sig = sig, a = a, b = b, a2 = a2[j], b2 = b2[j], ps_m = ps_m,  ps_s = ps_s, njump = njump) 
19: ApplyFitPoissRegNRE(y, hashABC, hashAB, hashA, nb = 200, nc = 800, sig = 1000, a = 2, b = 2, a2 = rep(100, 3), b2 = rep(5, 3),  ps_m = 0.01, ps_s = 0.03, njump = 4) 
20: eval(expr, envir, enclos) 
21: eval(ei, envir) 
22: withVisible(eval(ei, envir)) 

私はGoogleで検索していると一部の人々は、このsegfalut Rで問題とどのような彼らは通常、提案に遭遇しましたが、いくつかのバージョンの競合であり、Rは再インストールする必要があります。しかし、私の場合の奇妙なことは、私のアルゴリズムが最初の千回の反復で正しく機能することです。私も並列化せずにそれを実行し、それもうまく動作します。

誰もがこれにいくつかの原因が考えられますか?今私は完全に方向性がない。

ありがとう!

答えて

1

mclapply関数を呼び出すたびに、ゾンビプロセスが残っている可能性があります。繰り返し呼び出すので、膨大な数の情報が蓄積され、最終的に問題が発生する可能性があります。

あなたはゾンビプロセスを取り除くために、すべての子プロセスを待機関数を作成する inlineパッケージを使用することができます

library(inline) 
includes <- '#include <sys/wait.h>' 
code <- 'int wstat; while (waitpid(-1, &wstat, WNOHANG) > 0) {};' 
wait <- cfunction(body=code, includes=includes, convention='.C') 

あなたはmclapplyforループ内でwaitを呼び出す場合、それは取り除く必要がありますすべてのゾンビと考えられる問題としてこれを排除:

for (iter in 1:T) { 
    res[iter] = mclapply(1:10, fun) 
    wait() 
} 
1

ゾンビプロセスをチェックするためのスティーブの提案に加えて、コメントを:あなたのコードが再発オフ産卵されたように見えます電話番号mclapply(..., mc.cores = ncores)が呼び出されます。言い換えれば

4: mclapply(1:n, FUN = function(k) { return(OptimRE(dataSummaries[[k]], mu + beta, v, vre))}, mc.cores = ncores) 
[...] 
16: mclapply(1:length(beta), FUN = function(k) { return(getMargLikelihood0(dataSummaries_layer1[[k]], mu, v, vre, beta[k], logarithm = TRUE))}, mc.cores = ncores) 

、あなたは「ncores * ncores」各反復におけるフォークプロセスに終わるかもしれません。私は2つのncoresがここにあるのか分からないが、これが本当にあなたが望むものであることを確認してください。

+0

これは良いキャッチです!私は入れ子にされたmclapplyを持っていました。私は現在のテストでそれをSteveの提案と共に変更し、問題は解決しました!テストは時間がかかりますので、問題があなたの提案やスティーブのもので解決されたかどうかを判断するコントロールテストはできません。間違いなく、両方のコードの安定性の面で役立ちます。以前に投稿されて以来、私は答えとしてSteve'sを選択しました:) – Bayesric

関連する問題