我在使用R中的foreach函数进行并行处理时遇到问题。
以下代码可以正常工作:
library(foreach)
library(doParallel)
city_list <- c("city1", "city2")
date_list <- c("date1", "date2")
city_date_list <- foreach(city=city_list, .combine='c') %do% {
foreach(date = date_list, .combine='c') %do% {
city_date <- paste(city, date)
city_date
}
}
print(city_date_list)
[1] "city1 date1" "city1 date2" "city2 date1" "city2 date2"
但是,当我尝试从%do%更改为%dopar%时,代码开始抛出错误。 这是并行处理的更新代码
library(foreach)
library(doParallel)
city_list <- c("city1", "city2")
date_list <- c("date1", "date2")
myCluster <- makeCluster(4, type="PSOCK")
registerDoParallel(myCluster)
city_date_list <- foreach(city=city_list, .combine='c') %dopar% {
foreach(date = date_list, .combine='c') %dopar% {
city_date <- paste(city, date)
city_date
}
}
stopCluster(myCluster)
print(city_date_list)
这是生成的输出
> city_date_list <- foreach(city=city_list, .combine='c') %dopar% {
+ foreach(date = date_list, .combine='c') %dopar% {
+ city_date <- paste(city, date)
+ city_date
+ }
+ }
Error in { : task 1 failed - "could not find function "%dopar%""
>
> stopCluster(myCluster)
>
> print(city_date_list)
Error in print(city_date_list) : object 'city_date_list' not found
我不确定错误是什么。这些是我正在运行的会话的详细信息。
> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
locale:
[1] LC_COLLATE=English_India.1252 LC_CTYPE=English_India.1252 LC_MONETARY=English_India.1252
[4] LC_NUMERIC=C LC_TIME=English_India.1252
attached base packages:
[1] parallel stats graphics grDevices utils datasets methods base
other attached packages:
[1] doParallel_1.0.11 iterators_1.0.9 foreach_1.4.4
loaded via a namespace (and not attached):
[1] compiler_3.4.3 magrittr_1.5 tools_3.4.3 yaml_2.1.18 stringi_1.1.7 codetools_0.2-15 knitr_1.20
[8] stringr_1.3.0
关于如何纠正这一点的任何想法?
答案 0 :(得分:1)
嵌套foreach
循环时,除一个循环外,应在所有循环上使用嵌套运算符%:%
。伪代码:
foreach (...) %:%
foreach (...) %dopar%
....
答案 1 :(得分:0)
要在foreach
循环中使用其他库时,必须将它们导出到并行集群节点。因此,您必须在.export
函数调用中使用foreach
参数:
city_date_list <- foreach(city=city_list, .combine='c',
.packages = c("foreach") # this does the trick
) %dopar% {
foreach(date = date_list, .combine='c') %dopar% {
city_date <- paste(city, date)
city_date
}
}
根据?foreach
的学习,
.packages
->任务所依赖的软件包的字符向量。如果ex要求加载R软件包,则可以使用此选项在每个worker上加载该软件包。与%do%
一起使用时被忽略。
因此,这在您的第一个示例中不会发生,而在第二个示例中(使用并行)会发生。
但是,我不确定嵌套的foreach
是否必要/有用。