我使用doSnow和foreach并行发送一堆消息,但它们扰乱了我的日志,使它们难以解析。下面的简单示例:
library(foreach)
library(doSNOW)
numbers <- 1:6
cool_print <- function(x) print(paste0(x, " is cool"))
cl <- makeCluster(2, outfile="") # "" passes messages to standard out
registerDoSNOW(cl)
sns_responses <-
foreach(
x = numbers
) %dopar% {
cool_print(x)
}
stopCluster(cl)
输出以下内容:
Type: EXEC
Type: EXEC
Type: EXEC
Type: EXEC
[1] "1 is cool"
[1] "2 is cool"
Type: EXEC
[1] "3 is cool"
Type: EXEC
[1] "4 is cool"
Type: EXEC
[1] "5 is cool"
Type: EXEC
[1] "6 is cool"
> stopCluster(cl)
Type: DONE
Type: DONE
我只想把所有的";很酷";声明。
你能做到吗?有没有一个我可以在Snow中设置的选项可以打印,但不能打印其他东西?
请参阅我的评论为什么不';并行作业是否在RStudio中打印?为什么使用outfile = ""
很可能而不是解决方案——这更像是一种不起作用的破解。
以下是使用未来框架的解决方案(免责声明:我是作者(,该框架尽可能接近您的示例,同时将工人产生的输出中继到主R流程:
library(foreach)
library(doFuture)
registerDoFuture()
cl <- parallel::makeCluster(2)
plan(cluster, workers=cl)
cool_print <- function(x) print(paste0(x, " is cool"))
numbers <- 1:6
sns_responses <- foreach(x=numbers) %dopar% {
cool_print(x)
}
parallel::stopCluster(cl)
请注意,只有当工作者完成任务时,输出才会被中继,并且总是按顺序运行,所以会有延迟。如果你在进度更新之后,你可以使用progressr包(免责声明:我也是这里的作者(,例如
library(foreach)
library(doFuture)
library(progressr)
registerDoFuture()
cl <- parallel::makeCluster(2)
plan(cluster, workers=cl)
cool_print <- function(x) print(paste0(x, " is cool"))
numbers <- 1:6
with_progress({
p <- progressor(along=numbers)
sns_responses <- foreach(x=numbers) %dopar% {
p(paste0(x, " is cool"))
cool_print(x)
}
})
parallel::stopCluster(cl)
您似乎没有在本地机器上工作,这可能会导致此问题。尝试将outfile更改为"/dev/null"。检查文档:
"将工作线程的stdout和stderr连接输出定向到何处"quot;指示没有重定向(这可能只对本地计算机上的工作人员有用(。默认为"/dev/null"(在Windows上为"nul:"(。另一种可能性是工作程序主机上的文件路径。文件将以附加模式打开,因为所有工作人员都登录到同一个文件">