如何从clusterApply打印?

时间:2019-06-07 22:42:42

标签: r printing parallel-processing

library(parallel)
cl=makeCluster(4)
txts = c("I", "AM", "NOT", "PRINTED")
clusterApply(cl, txts, function(txt){write(txt, stderr())})
stopCluster(cl)
txts = c("WHILE", "I", "AM", "PRINTED")
lapply(txts, function(txt){write(txt,stderr())})

运行上述代码时,似乎忽略了从writeclusterApply的调用:什么都不会打印。

我要从clusterApply打印的原因是,我要运行的代码预计将需要很多小时才能完成;我希望能够监视进度。

我发现了一种令人惊奇的从clusterApply打印的方法;也就是说,通过clusterApply通过Rcpp运行的C ++代码可以打印到控制台。不过,这样做似乎已经足够矫kill过头了。

还有其他从std::cerr打印的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用makeCluster(4, outfile = "")跟踪进度。这也会打开write(txt, stderr())

的输出

此解决方案outfile = "" seems仅用于Linux系统。有关窗口的更多信息,请检查链接的问题和注释。似乎有些解决方案,例如使用Rterm代替Rgui,但由于无法测试,因此无法提供给您。

我在xubuntu 18.04上使用了以下代码并获得了所有调用。

library(parallel)
cl=makeCluster(4, outfile ="")
txts = c("I", "AM", "NOT", "PRINTED", seq(1,1000000,1))
clusterApply(cl, txts, function(txt){write(txt,stdout())})
stopCluster(cl) 

摘自makeCluster的纪录片:

  

输出文件:

     

将stdout和stderr连接输出指向何处   来自工人。 “”表示没有重定向(只能是   对于本地计算机上的工作人员很有用)。默认为“ / dev / null”   (在Windows中为“ nul:”)。另一种可能性是   工人的主人。当所有工作人员登录时,文件将以附加模式打开   到同一文件。

因此,如果要使用stderr,则必须澄清输出文件

答案 1 :(得分:0)

您需要捕获在后台工作程序中生成的标准输出,并将其作为结果的一部分返回,然后在主R流程中将其重新输出。未来的框架会自动执行此操作,同时还会自动执行“中继”以及消息和警告条件:

> library(future.apply)

> cl <- parallel::makeCluster(4)
> plan(cluster, workers = cl)

> txts <- c("I", "AM", "ALSO", "PRINTED")
> y <- future_lapply(txts, function(txt) {
+   print(txt)
+   message("M: ", txt)
+ })
[1] "I"
M: I
[1] "AM"
M: AM
[1] "ALSO"
M: ALSO
[1] "PRINTED"
M: PRINTED

> parallel::stopCluster(cl)

仅供参考,在未来软件包的下一个版本中,将尽快中继工人的输出,即,在结果被收集并可用时尽快传递。在当前版本中,只有当所有工作人员都完成后,它才会中继。

其他评论:

您实际上并不想显式输出到stderr()-有一个原因请参阅https://github.com/HenrikBengtsson/Wishlist-for-R/issues/55

使用outfile = ""创建PSOCK群集的方法应被视为是一种hack。该输出将以“背景”结束,R不能在任何地方捕获它,是否显示在很大程度上取决于您所运行的环境类型,即如果R在Linux的终端中运行,其行为会有所不同,在Windows上,在Windows上的Rgui中,在RStudio等上。