R包并行:如何从一个节点打印输出?

时间:2017-02-15 12:47:22

标签: r printing parallel-processing

我正在使用R包并行的parSapply函数。 我对此函数的调用类似于:

cl <- makeCluster(3, type="PSOCK",outfile="output.txt")
m<-10
parSapply(cl,as.list(1:m), FUN=function(mtmp){
 comp<-0
 for (ii in 1:10){
  print(ii)
  comp<-comp+rnorm(1)
 }
 return(comp)
})

并行化功能会打印一条消息以跟踪该过程。这对于估计函数所需的时间非常有用。使用此代码,每个节点的打印消息都存储在txt文件(output.txt)中,但由于所有节点在同一时间生成消息,因此会熔化。因此,要在我的txt文件中打印可读的打印消息,我想只关注一个节点的过程。我在想,对于{1,4,7,10}中的mtmp,迭代是在同一个节点上进行的。所以,我试图添加条件:

if(mtmp%%3==1){print(ii)}

但是,消息再次被融化,这表明{1,4,7,10}中的mtmp调用不在同一节点上执行。

因此,我的问题是:如何在我的txt文件中保存一个节点的所有打印消息,而只保存这个节点?另外,我希望这个节点能够处理对并行化函数的大量调用。

非常感谢你的帮助,

文森特

1 个答案:

答案 0 :(得分:4)

将每个流程的输出转移到单独的文件中:

library(parallel)
cl <- makeCluster(3, type="PSOCK")
#divert to different files:
clusterEvalQ(cl, sink(paste0("E:/temp/output", Sys.getpid(), ".txt")))

m<-10

parSapply(cl,as.list(1:m), FUN=function(mtmp){
  comp<-0
  for (ii in 1:10){
    print(ii)
    comp<-comp+rnorm(1)
  }
  return(comp)
})

stopCluster(cl)