【问题标题】:How to print from clusterApply?如何从 clusterApply 打印?
【发布时间】:2019-06-07 22:42:42
【问题描述】:
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())})

运行上述代码时,从clusterApplywrite 的调用似乎被忽略:没有打印任何内容。

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

我从clusterApply 发现了一种令人惊讶的打印方式;即通过 Rcpp fromclusterApply 运行的 C++ 代码可以通过std::cerr 打印到控制台。不过,这样做似乎太过分了。

还有其他方法可以从clusterApply打印吗?

【问题讨论】:

    标签: r printing parallel-processing


    【解决方案1】:

    您可以使用makeCluster(4, outfile = "") 跟踪您的进度。这也开启了write(txt, stderr())的输出

    此解决方案 outfile = "" seems 仅适用于 linux 系统。有关 Windows 的更多信息,请查看链接的问题和评论。似乎有一些解决方案,例如使用 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,你必须澄清outfile

    【讨论】:

      【解决方案2】:

      您需要捕获后台工作程序中产生的标准输出并作为结果的一部分返回,然后在主 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)
      

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

      其他 cmets:

      您并不想明确地输出到stderr() - 出于一个原因,请参阅https://github.com/HenrikBengtsson/Wishlist-for-R/issues/55

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

      【讨论】:

        猜你喜欢
        • 2016-11-11
        • 1970-01-01
        • 2012-04-17
        • 2020-04-04
        • 2022-06-21
        • 2012-12-08
        • 2013-03-20
        • 1970-01-01
        相关资源
        最近更新 更多