首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在纯素函数中使用并行处理?

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

Stack Overflow用户
提问于 2020-04-29 13:37:00
回答 1查看 221关注 0票数 3

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

代码语言:javascript
复制
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)

电脑详细资料:

  • R V4.0
  • Win 10x64
  • i5-8350 4核
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-25 20:20:23

我不知道这个答案有多大帮助,但我将分享我自己的一些观察和事情,我慢慢拼凑在一起。我不假装是这方面的专家,所以以我的答案为例,我意识到这里可能有一些不准确的地方。我首先是生物学家。

其中一些并行库似乎重新加载r环境,并运行任何启动文件(例如,rprofile),每个核心都有。因此,使用并行库有一个固有的时间开销,因此只有当并行函数的计算量足够大时才能看到并行函数的好处(在您的示例中,沙丘数据集非常小)。下面我将分享我自己的基准)。尽管如此,有几件事似乎是有帮助的。

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

代码语言:javascript
复制
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的并行选项来获得时间好处。这是我的基准。

代码语言:javascript
复制
> 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个位点)

代码语言:javascript
复制
> 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选项应用于更大的数据集而受益。

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

  • R版本: 4.0.2
  • Windows 10,64位
  • Ryzen 3600
  • 64 10

F 215

不管怎么说,我还在找其他的工作-周旋和诡计。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61503107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档