如何避免';水槽堆叠已满';使用sink()捕获foreach循环中的消息时出错
为了查看在如何避免';水槽堆叠已满';使用sink()捕获foreach循环中的消息时出错,r,foreach,cat,sink,R,Foreach,Cat,Sink,为了查看在foreach()循环中运行的函数输出的控制台消息,我按照的建议添加了一个sink()调用,如下所示: library(foreach) library(doMC) cores <- detectCores() registerDoMC(cores) X <- foreach(i=1:100) %dopar%{ sink("./out/log.branchpies.txt", append=TRUE) cat(paste(
foreach()
循环中运行的函数输出的控制台消息,我按照的建议添加了一个sink()
调用,如下所示:
library(foreach)
library(doMC)
cores <- detectCores()
registerDoMC(cores)
X <- foreach(i=1:100) %dopar%{
sink("./out/log.branchpies.txt", append=TRUE)
cat(paste("\n","Starting iteration",i,"\n"), append=TRUE)
myFunction(data, argument1="foo", argument2="bar")
}
库(foreach)
图书馆(doMC)
cores这在我的Mac上运行时没有错误:
library(foreach)
library(doMC)
cores <- detectCores()
registerDoMC(cores)
X <- foreach(i=1:100) %dopar%{
sink("log.branchpies.txt", append=TRUE)
cat(paste("\n","Starting iteration",i,"\n"))
sink() #end diversion of output
rnorm(i*1e4)
}
库(foreach)
图书馆(doMC)
cores正如所建议的,跟踪汇堆栈是相当困难的。因此,建议使用cat
写入文件的功能,如上面的回答中所建议的:
cat(..., file="log.txt", append=TRUE)
要保存一些输入,可以创建一个包装器函数,每次调用cat
时将输出转移到文件:
catf <- function(..., file="log.txt", append=TRUE){
cat(..., file=file, append=append)
}
希望有帮助 在for循环中调用sink()(不带任何参数),将其重置为在每次迭代结束时结束文件写入,您将不会再次遇到此错误 你真的在并行运行吗?为什么要对文件使用sink
和cat
?我使用foreach
对列表中的100个元素并行运行相同的计算密集型函数,因为使用for
循环,甚至mclappy
(我已经尝试过了,速度要慢得多)。我使用的是sink
和cat
,因为链接页面建议我这样做,并且因为它有助于跟踪foreach
循环执行的迭代。您没有回答问题。您不会显示如何设置集群。此外,如果正确设置集群,您链接到的教程不使用cat
mclappy
的file
参数,其速度不应比foreach
慢。抱歉,我实际上没有在cat
中使用file参数-这是我正在尝试的。我打错了密码。我现在就修。谢谢。我的原始代码的问题一定是它没有包含sink()来结束输出的转移。我怀疑这对我来说不起作用,因为每个工作人员都是事先脱离循环的,所以这可能取决于循环到达它。
cat(..., file="log.txt", append=TRUE)
catf <- function(..., file="log.txt", append=TRUE){
cat(..., file=file, append=append)
}
library(foreach)
library(doMC)
cores <- detectCores()
registerDoMC(cores)
X <- foreach(i=1:100) %dopar%{
catf(paste("\n","Starting iteration",i,"\n"))
rnorm(i*1e4)
}