R中并行计算的stdout和stderr

RNA*_*RNA 4 parallel-processing r stdout stderr

我正在使用该包parallel进行计算。这是一个玩具示例:

library(parallel)
m = matrix(c(1,1,1,1,0.2,0.2,0.2,0.2), nrow=2)
myFun = function(x) {
  if (any(x<0.5)) {
    write("less than 0.5", stderr())
    return(NA)
  } else {
    write("good", stdout())
    return(mean(x))
  }
}
cl = makeCluster(2, outfile="/tmp/output")
parApply(cl, m, 2, myFun)
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

问题是 stdout 和 stderr 都将被重定向到/tmp/output. 该output文件如下所示:

starting worker pid=51083 on localhost:11953 at 11:37:12.966
starting worker pid=51093 on localhost:11953 at 11:37:13.261
good
good
less than 0.5
less than 0.5
Run Code Online (Sandbox Code Playgroud)

有没有办法分别为 stdout 和 stderr 设置两个单独的文件?以及如何忽略“starting worker pid=...”的前两行?

Ste*_*ton 5

parallel包不直接支持将 stdout 和 stderr 发送到单独的文件,但您可以自己执行此操作:

cl = makeCluster(2)

setup = function(outfile, errfile) {
  assign("outcon", file(outfile, open="a"), pos=.GlobalEnv)
  assign("errcon", file(errfile, open="a"), pos=.GlobalEnv)
  sink(outcon)
  sink(errcon, type="message")
}

shutdown = function() {
  sink(NULL)
  sink(NULL, type="message")
  close(outcon)
  close(errcon)
  rm(outcon, errcon, pos=.GlobalEnv)
}

clusterCall(cl, setup, "/tmp/output", "/tmp/errmsg")
parApply(cl, m, 2, myFun)
clusterCall(cl, shutdown)
Run Code Online (Sandbox Code Playgroud)

由于“启动工作程序”消息是在调用之前发出的,因此这些消息将被重定向到“/dev/null”,这是未指定setup时的默认行为。outfile