我对并行执行素食包中的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)电脑详细资料:
发布于 2021-02-25 20:20:23
我不知道这个答案有多大帮助,但我将分享我自己的一些观察和事情,我慢慢拼凑在一起。我不假装是这方面的专家,所以以我的答案为例,我意识到这里可能有一些不准确的地方。我首先是生物学家。
其中一些并行库似乎重新加载r环境,并运行任何启动文件(例如,rprofile),每个核心都有。因此,使用并行库有一个固有的时间开销,因此只有当并行函数的计算量足够大时才能看到并行函数的好处(在您的示例中,沙丘数据集非常小)。下面我将分享我自己的基准)。尽管如此,有几件事似乎是有帮助的。
使用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)在我自己的工作中,我注意到rscript选项的增加大大提高了我的速度(对不起,没有基准,希望能很快完成)。如果我还记得我从哪里得到这个建议的来源,我会回来分享。
这无助于运行Adonis,但是我认为初始时间成本可能解释了为什么我们没有看到使用沙丘数据集上内置到Adonis的并行选项来获得时间好处。这是我的基准。
> 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 在这个集合上没有太大的差别,但是并行的速度更慢。然而,在我目前正在工作的一个大集合中重复使用(bc是一个距离矩阵,从有887种的物种矩阵中计算出3734个位点)
> 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 长话短说,在这种特殊情况下,您可能只会通过将adonis选项应用于更大的数据集而受益。
我不知道计算机规范在这里有多重要,但我确实有大量的内存用于这类用途。在我的例子中,内存对于让我更容易地处理大型矩阵来说更为重要。
F 215
不管怎么说,我还在找其他的工作-周旋和诡计。
https://stackoverflow.com/questions/61503107
复制相似问题