【问题标题】:R package parallel: how to print the output from one node?R包并行:如何打印一个节点的输出?
【发布时间】:2017-02-15 12:47:22
【问题描述】:

我正在并行使用 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 文件中,并且只保存这个节点的所有打印消息?此外,我希望这个节点能够处理对我的并行函数的大量调用。

非常感谢您的帮助,

文森特

【问题讨论】:

    标签: r printing parallel-processing


    【解决方案1】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-16
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 2017-09-08
      相关资源
      最近更新 更多