R 在纯素函数中使用并行处理?

R 在纯素函数中使用并行处理?,r,vegan,R,Vegan,我对并行执行vegan包中的R函数adonis感兴趣。然而,我不清楚如何使它并行运行。无论我如何尝试初始化它,它似乎需要相同的时间来执行。有人能解释一下我做错了什么吗 require(vegan) require(parallel) data(dune) data(dune.env) #This: system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999)) #Runs faster (4.49 s) than this

我对并行执行vegan包中的R函数adonis感兴趣。然而,我不清楚如何使它并行运行。无论我如何尝试初始化它,它似乎需要相同的时间来执行。有人能解释一下我做错了什么吗

require(vegan)
require(parallel)
data(dune)
data(dune.env)
#This:
system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999))
#Runs faster (4.49 s) than this (6.7 s):
system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999, parallel=3))
#or this (6.7 s)
cl <- makeCluster(3)
system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999, parallel=cl))
stopCluster(cl)
require(素食主义者)
需要(并行)
数据(沙丘)
数据(沙丘环境)
#这:
系统时间(adonis(dune~Management*A1,dune.env,perm=99999))
#运行速度(4.49秒)比此(6.7秒)快:
系统时间(adonis(dune~Management*A1,dune.env,perm=99999,parallel=3))
#或者这个(6.7秒)

cl我不确定这个答案到底有多大帮助,但我将分享一些我自己的观察结果和我慢慢拼凑起来的东西。我并不假装是这方面的专家,所以我的回答可能有一些不准确之处。我首先是生物学家

这些并行库中的一些似乎会重新加载r-environment,并在每个核心上运行所有的启动文件(例如RProfile)。因此,使用并行库有一个固有的时间成本,这使得只有当计算量足够大,值得并行化时,您才能看到并行函数的好处(在您的示例中,Dune数据集非常小。我将在下面分享我自己的基准测试)。也就是说,有一些事情似乎有帮助

使用
doParallel
库,您可以指定参数以避免将不必要的信息加载到会话中,如下所示:

library(doParallel)
cl <- makeCluster(3, rscript_args = c("--no-init-file", "--no-site-file","--no-environ"))
#for linux   .... cl <- makePSOCKcluster(2)
registerDoParallel(cl)
unif_w = UniFrac(d, weighted=T, parallel=T, normalized = T)
unif_uw = UniFrac(d, weighted=F, parallel=T)
stopCluster(cl)
这台电视机没有太大的差别,但同时速度较慢。然而,在我目前正在处理的一个大集合中重复了这一点(bc是一个距离矩阵,由物种矩阵计算得出,该矩阵由3734个地点的887个物种组成)

长话短说,在这种特定情况下,只有将adonis选项应用于更大的数据集,您才能从中获益

我不确定计算机规格在这里有多重要,但我确实有大量内存用于这种用途。在我的例子中,记忆对于让我更容易处理大型矩阵来说更为重要

  • R版本:4.0.2
  • Windows 10,64位
  • AMD Ryzen 3600
  • 64gb内存

不管怎样,我还在寻找其他的解决方法和技巧。

我自己也很好奇,你有没有找到一个让阿多尼斯并行运行的好方法?
> data("dune")
> data("dune.env")
> system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999))
   user  system elapsed 
   3.90    0.00    3.93 
> #Runs faster (4.49 s) than this (6.7 s):
> system.time(adonis(dune ~ Management * A1, dune.env, perm = 99999, parallel=3))
   user  system elapsed 
   0.71    0.04    6.53 
> system.time(adonis(bc ~ fmet$Diagnosis, parallel = 1))
   user  system elapsed 
 109.95   21.27  131.22 
> system.time(adonis(bc ~ fmet$Diagnosis, parallel = 4))
   user  system elapsed 
   3.44    1.41   82.36