Параллельная обработка в R вызывает сетчатую функцию Python - PullRequest
0 голосов
/ 22 октября 2019

Я использую reticulate в RMarkdown и пытаюсь запустить локально определенную функцию Python с параллельной обработкой. Я огляделся по сторонам, и этот ответ наиболее близок к решению моей проблемы, за исключением того, что функция, которую я использую, не определена в отдельном скрипте Python, а скорее в Rmarkdown. Ниже приведен упрощенный пример использования llply, который дает мне ошибку Error in unserialize(socklist[[n]]) : error reading from connection.

Я также пробовал foreach(), который не распознает объект py$ даже с reticulate::py$function.

Я также пробовал mclapply и 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)
```

Я не очень хорошо разбираюсь в сетчатой ​​или параллельной обработке и буду очень благодарен за любую помощь.

1 Ответ

0 голосов
/ 22 октября 2019

Я совершенно уверен, что reticulate может не выполняться параллельно, по крайней мере, при настройке его в одном процессе R и последующей попытке его повторного использования в другом (таким образом,Вы делаете это здесь). Причина в том, что сетка создает объекты, которые нельзя экспортировать в другие процессы. У меня есть пример этого в разделе «Пакет: сетка» в https://cran.r -project.org / web / packages / future / vignettes / future-4-non-exportable-objects.html .

Возможный обходной путь - создать отдельный экземпляр сетчатки для каждого параллельного рабочего.

...