并行化函数 poly2nb {spdep}

parallelizing function poly2nb {spdep}

spdep::poly2nb 的文档在参数下包含以下条目:

foundInBox: default NULL using R code, possibly parallelised if a snow cluster is available, otherwise a list of length (n-1) with integer vectors of candidate neighbours (j > i), or NULL if all candidates were (j < i) (as created by the poly_findInBoxGEOS function in rgeos for clean polygons)

我将粗体部分解释为如果此参数为 NULL(默认值)并且注册了雪簇,则函数将被并行化。我试过这样做:

cl <- parallel::makeCluster(7)
doParallel::registerDoParallel(cl)

spdep::poly2nb(squamate_dist) # squamate_dist is a large SpatialPolygonDataFrame

查看任务管理器未显示任何并行化。并行 运行 这个函数的正确方法是什么?另外,有没有办法在向参数 foundInBox?

提供列表时并行化它

spdep 包 (1.1-8) 使用类似 spdep::set.mcOption 的函数来设置并行计算。请参阅 ?spdep::set.mcOption 中的示例,了解他们是如何做到的。

我无法确认这对 spdep::poly2nb 有效,但在使用 spdep::skaterspdep::nbcosts 时对我有效。

在函数中我这样使用它:

function_using_spdep <- function(...) {
  nc <- 4L # number of cores
  cores_opt <- set.coresOption(nc)
  mc_opt <- set.mcOption(FALSE)
  cl <- parallel::makeCluster(get.coresOption())
  set.ClusterOption(cl)
  on.exit({
    set.coresOption(cores_opt)
    set.mcOption(mc_opt)
    set.ClusterOption(NULL)
    parallel::stopCluster(cl)
  })

  # do spdep stuff
}