R optimParallel - 找不到函数

标签 r optimization parallel-processing

我试图了解 optimParallel 如何处理嵌入式函数:

fn1 <- function(x){x^2-x+1}
fn2 <- function(x){fn1(x)}     # effectively fn1

cl <- parallel::makeCluster(parallel::detectCores()-1)
parallel::setDefaultCluster(cl = cl)

optimParallel::optimParallel(par = 0, fn = fn1)         # Worked
optimParallel::optimParallel(par = 0, fn = fn2)         # Not working

parallel::setDefaultCluster(cl=NULL)
parallel::stopCluster(cl)

为什么第二个不起作用?错误消息是

Error in checkForRemoteErrors(val) : 
  3 nodes produced errors; first error: could not find function "fn1"

如何解决?

最佳答案

此问题特定于所使用的集群类型:

如果FORK集群是在函数定义之后创建的,那么它就可以工作。 FORK 集群仅适用于类似 Linux 的系统:

library(optimParallel)
fn1 <- function(x) x^2-x+1 
fn2 <- function(x) fn1(x)
cl <- makeCluster(detectCores()-1, type="FORK")
setDefaultCluster(cl=cl)
optimParallel(par=0, fn=fn2)[[1]]
## [1] 0.5

对于其他集群类型,可以将 fn1 作为参数添加到 fn2 并将其作为 ... 参数添加到 optimParallel ():

fn1 <- function(x) x^2-x+1 
fn2 <- function(x, fn1) fn1(x)
cl <- makeCluster(detectCores()-1)
setDefaultCluster(cl=cl)
optimParallel(par=0, fn=fn2, fn1=fn1)[[1]]
## [1] 0.5

或者,可以将 fn1 导出到集群中的所有 R 进程:

fn1 <- function(x) x^2-x+1 
fn2 <- function(x) fn1(x)
cl <- makeCluster(detectCores()-1)
setDefaultCluster(cl=cl)
clusterExport(cl, "fn1")
optimParallel(par=0, fn=fn2)[[1]]
## [1] 0.5

关于R optimParallel - 找不到函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58601196/

相关文章:

python - Levenshtein两个文件上的距离花费太多时间

java-8 - 使用 Java 8 并行流读取文件行是个好主意吗?

带有parallelmap的rjdbc并行查询

r - 使用 R 获取 HDF5 对象中对象的列名

r - 在 R 中提取模式周围的行

r - 如何一次更改多个列名?

r - Boost 和 Rcpp 的问题

c++ - OpenCV 前景检测速度慢

枚举一个矩形可以被分割成 n 个更小的矩形的所有可能方式的算法

python - 如何确定 numba 的 prange 是否真的正常工作?