首页 > 解决方案 > R中的并行处理调用网状python函数

问题描述

reticulate在 RMarkdown 中使用并尝试运行具有并行处理的本地定义的 Python 函数。我环顾四周,这个答案是我发现的最接近解决我的问题的答案,除了我使用的函数不是在单独的 Python 脚本中定义的,而是在 Rmarkdown 中定义的。下面是一个使用的简化示例llply,它给了我错误Error in unserialize(socklist[[n]]) : error reading from connection

我也尝试过foreach(),即使使用 . 也无法识别该py$对象reticulate::py$function

我也尝试过mclapplyand pbmcapply,它似乎可以运行并参与所有核心,但它们会一直挂起并且不会完成。

```{r}
    library(reticulate)
    library(doParallel)
    library(foreach)
    library(plyr)
```

```{python}
def myFn1(x):
    return(sqrt(x))
```

```{r}
cl <- makeCluster(detectCores())
registerDoParallel(cl)
llply(list(2, 3, 4), .fun=reticulate::py$myFn1, .parallel=TRUE)
stopCluster(cl)
```

我对网状或并行处理不是很了解,如果能提供任何帮助,我将不胜感激。

标签: pythonrparallel-processingreticulate

解决方案


我很确定reticulate不能并行运行,至少在一个 R 进程中设置它然后尝试在另一个进程中重用它时(就像你在这里做的那样)。原因是 reticulate 创建的对象无法导出到其他进程。我在https://cran.r-project.org/web/packages/future/vignettes/future-4-non-exportable-objects.html的“包:网状”部分中有一个示例。

一种可能的解决方法是为每个并行工作人员设置一个单独的网状实例。


推荐阅读