对于循环使用 R 中的多核和 foreach
For loop using multicores in R with foreach
我有一段非常长的代码,它由多个用户定义的函数组成,这些函数来自我的代码开头。整个脚本在一个 for
循环中,一个一个地读取 csv 文件,分析它们并在每次迭代中输出 2 个 csv 文件和一个 PNG。平均而言,每个文件的代码大约需要 18 秒,通常一次要分析大约 150/200 个文件。
这需要很长时间,所以我想利用我 PC 上的 8 个内核。
我已将主 for
循环更改为 foreach
并添加了 %dopar%
,但是,我的代码不起作用。
示例显示:
cl=makeCluster(8)
registerDoParallel(cl)
library(parallel)
library(foreach)
library(ggplot2)
library(data.table)
foreach(kk=1:2) %dopar% {
Data=rnorm(60000,3,kk)
Date=seq(as.POSIXct("2014-01-01 00:00:00"), length.out=60000, by="15 mins")
DF=data.frame(Date,Data)
DF$MeanDiff=sapply(DF$Data, function(x) abs(x-mean(DF$Data)))
write.csv(data.table(DF), file="Data with difference from mean.csv", row.names=F)
DF$Colour=c(rep("Pink",30000),rep("Blue",30000))
file_name_data = "Test plot.jpg"
png(filename=file_name_data,width=900,height=600,res=80)
print(ggplot(DF, aes(Date, Data,colour=Colour, group=1))+geom_line()+geom_point()+
scale_x_datetime(limits=c(as.POSIXct(Date[1]), as.POSIXct(Date[length(Date)])), labels = date_format("%d-%m-%y")))
dev.off()
}
我认为问题是其他加载的包无法在 foreach
循环中使用。如果是这种情况,我该如何纠正?其次,这是否也意味着之前在循环外加载的任何源代码文件都无法使用?即我的用户定义函数?
我可能没有抓住要点,但我想有一种更简单的方法可以做到这一点,但我还没有掌握。如有任何建议,我们将不胜感激。
library(parallel)
library(foreach)
library(doSNOW)
cl <- makeCluster(8) #8 is the number of cores
registerDoSNOW(cl)
foreach(kk=1:2) %dopar% {
#your code
}
library(doParallel)
library(foreach)
cl <- 4
registerDoParallel(cl)
foreach(kk=1:2)%dopar%{
library(ggplot2)
library(data.table)
#your code
}
我刚刚开始使用foreach,所以我这样说可能是错误的,但到目前为止我是这样理解的。当您将 foreach 与 doParallel 一起使用时,它会创建一个新的 R 实例,这需要您为每个实例重新加载您的库。此外,在调用 foreach 之前加载到工作区中的任何内容,以及随后在 foreach 循环中调用的任何内容,都将被转移到新实例中。
我有一段非常长的代码,它由多个用户定义的函数组成,这些函数来自我的代码开头。整个脚本在一个 for
循环中,一个一个地读取 csv 文件,分析它们并在每次迭代中输出 2 个 csv 文件和一个 PNG。平均而言,每个文件的代码大约需要 18 秒,通常一次要分析大约 150/200 个文件。
这需要很长时间,所以我想利用我 PC 上的 8 个内核。
我已将主 for
循环更改为 foreach
并添加了 %dopar%
,但是,我的代码不起作用。
示例显示:
cl=makeCluster(8)
registerDoParallel(cl)
library(parallel)
library(foreach)
library(ggplot2)
library(data.table)
foreach(kk=1:2) %dopar% {
Data=rnorm(60000,3,kk)
Date=seq(as.POSIXct("2014-01-01 00:00:00"), length.out=60000, by="15 mins")
DF=data.frame(Date,Data)
DF$MeanDiff=sapply(DF$Data, function(x) abs(x-mean(DF$Data)))
write.csv(data.table(DF), file="Data with difference from mean.csv", row.names=F)
DF$Colour=c(rep("Pink",30000),rep("Blue",30000))
file_name_data = "Test plot.jpg"
png(filename=file_name_data,width=900,height=600,res=80)
print(ggplot(DF, aes(Date, Data,colour=Colour, group=1))+geom_line()+geom_point()+
scale_x_datetime(limits=c(as.POSIXct(Date[1]), as.POSIXct(Date[length(Date)])), labels = date_format("%d-%m-%y")))
dev.off()
}
我认为问题是其他加载的包无法在 foreach
循环中使用。如果是这种情况,我该如何纠正?其次,这是否也意味着之前在循环外加载的任何源代码文件都无法使用?即我的用户定义函数?
我可能没有抓住要点,但我想有一种更简单的方法可以做到这一点,但我还没有掌握。如有任何建议,我们将不胜感激。
library(parallel)
library(foreach)
library(doSNOW)
cl <- makeCluster(8) #8 is the number of cores
registerDoSNOW(cl)
foreach(kk=1:2) %dopar% {
#your code
}
library(doParallel)
library(foreach)
cl <- 4
registerDoParallel(cl)
foreach(kk=1:2)%dopar%{
library(ggplot2)
library(data.table)
#your code
}
我刚刚开始使用foreach,所以我这样说可能是错误的,但到目前为止我是这样理解的。当您将 foreach 与 doParallel 一起使用时,它会创建一个新的 R 实例,这需要您为每个实例重新加载您的库。此外,在调用 foreach 之前加载到工作区中的任何内容,以及随后在 foreach 循环中调用的任何内容,都将被转移到新实例中。