使用 foreach 进行并行处理时出错:“找不到函数“%dopar%””

Posted

技术标签:

【中文标题】使用 foreach 进行并行处理时出错:“找不到函数“%dopar%””【英文标题】:Error in parallel processing with foreach: "could not find function "%dopar%"" 【发布时间】:2019-02-07 02:25:04 【问题描述】:

我在使用 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   

关于如何纠正这个问题的任何想法?

【问题讨论】:

您需要导出函数和对象。尝试改用doFuture 正如@PoGibas 所说,如果在函数中使用 foreach,则需要导出全局变量。请参阅doFuture vignette 中的示例,关于 doFuture 的部分负责处理 foreach 的全局变量。 【参考方案1】:

当嵌套foreach 循环时,您应该在除一个循环之外的所有循环上使用嵌套运算符%:%。伪代码:

foreach (...) %:%
    foreach (...) %dopar%
        ....

请参阅nesting vignette for details。

【讨论】:

@Arpit 欢迎您。请接受/投票您认为合适的答案,c.f. ***.com/help/someone-answers.【参考方案2】:

当您想在foreach-loop 中使用其他库时,您必须将它们导出到并行集群节点。因此,您必须在foreach 函数调用中使用.export 参数:

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 包,则此选项可用于在每个工作人员上加载该包。与%do% 一起使用时被忽略。

因此,这不会发生在您的第一个示例中,而是第二个示例中(使用并行)。

但是,我不太确定嵌套的 foreach 是否必要/有用。

【讨论】:

以上是关于使用 foreach 进行并行处理时出错:“找不到函数“%dopar%””的主要内容,如果未能解决你的问题,请参考以下文章

在 gitlab 中使用 ssh 进行克隆/拉取/推送问题(创建 http 客户端时出错:找不到 cafile '':找不到 cafile)

初始化 ADB 时出错:找不到调试桥

R中的并行foreach共享内存

使用 MaxDegreeOfParallism 进行并行 foreach,有时会在两者之间停止进程

Jwplayer:加载播放器时出错:找不到可播放的来源

何时使用 Parallel.ForEach,何时使用 PLINQ