默认情况下,雪工产生的输出会被丢弃,但您可以使用 makeCluster “outfile” 选项来更改它。将 outfile 设置为空字符串 ("") 将防止 snow 重定向输出,这通常会导致打印消息的输出显示在主进程的终端上。
只需使用以下内容创建并注册您的集群:
library(doSNOW)
cl <- makeCluster(4, outfile="")
registerDoSNOW(cl)
您的 foreach 循环根本不需要更改。
这适用于我的 SOCK 集群和 MPI 集群,使用 Rmpi 构建 Open MPI。在 Windows 上,如果您使用 Rgui,您将看不到任何输出。如果你改用 Rterm.exe,你会的。
请注意,除了您自己的输出之外,您还会看到由 snow 生成的消息,这些消息也很有用。
要使用进度条,doSNOW 1.0.14 版有一个progress
选项。这是一个完整的例子:
library(doSNOW)
library(tcltk)
library(randomForest)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)
ntasks <- 100
pb <- tkProgressBar(max=ntasks)
progress <- function(n) setTkProgressBar(pb, n)
opts <- list(progress=progress)
x <- matrix(runif(500), 100)
y <- gl(2, 50)
rf <- foreach(ntree=rep(25, ntasks), .combine=combine,
.multicombine=TRUE, .packages='randomForest',
.options.snow=opts) %dopar% {
randomForest(x, y, ntree=ntree)
}
该progress
选项相当通用,因此您可以使用以下函数简单地打印一条消息:
progress <- function(n) cat(sprintf("task %d is complete\n", n))
该函数可以采用 0、1 或 2 个参数。第一个提供的参数是已完成任务的总数,第二个是刚刚完成的任务的任务号。
最简单的示例只是.
在任务完成时打印 a:
progress <- function() cat('.')
此示例显示两个参数,可用于演示任务并不总是按顺序完成:
progress <- function(nfin, tag) {
cat(sprintf('tasks completed: %d; tag: %d\n', nfin, tag))
}