并行化应用于parRapply

时间:2018-08-21 16:11:19

标签: r parallel-processing apply sp

我的数据集是:

ll <- matrix(c(5, 6, 60, 60), ncol=2)

然后我使用库“ sp” 中的函数 spDistsN1 来获取应用的距离矩阵:

apply(ll, 1, function(x) spDistsN1(as.matrix(ll), x, longlat = T))

但是我想通过并行化来做到这一点,

library(parallel)
ncore <- detectCores()
cl <- makeCluster(ncore)
clusterEvalQ(cl = cl, expr = c(library(sp)))
parRapply(cl = cl, x = ll, FUN =  function(x) spDistsN1(as.matrix(ll), x, 
longlat = T))

它显示以下错误:

checkForRemoteErrors(val)中的错误:   4个节点产生错误;第一个错误:找不到对象“ ll”

我该如何解决?

2 个答案:

答案 0 :(得分:4)

使用并发的parApply()parRapply()的一种更容易的选择是使用future.apply包中的future_apply()(免责声明:我是作者),因为全局变量是自动生成的已导出-无需担心parallel::clusterExport()等。只需像使用apply()一样使用它,例如

library(sp)
library(future.apply)
plan(multiprocess)  ## parallelize on local machine

ll <- matrix(c(5, 6, 60, 60), ncol = 2)

## Sequentially
y0 <-        apply(ll, 1, function(x) A(ll, x, longlat = TRUE))
print(y0)
#          [,1]     [,2]
# [1,]  0.00000 55.79918
# [2,] 55.79918  0.00000

## In parallel
y1 <- future_apply(ll, 1, function(x) spDistsN1(ll, x, longlat = TRUE))
print(y1)
#          [,1]     [,2]
# [1,]  0.00000 55.79918
# [2,] 55.79918  0.00000

print(identical(y1, y0))
# [1] TRUE

您可能还会发现博客文章future.apply - Parallelize Any Base R Apply Function很有帮助。

答案 1 :(得分:2)

您需要将所有变量导出到worker。参见?parallel::clusterExport