首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >理解并行计算:r future为什么会启动比workers多得多的线程?

理解并行计算:r future为什么会启动比workers多得多的线程?

作者头像
王诗翔呀
发布2022-04-28 17:18:31
7980
发布2022-04-28 17:18:31
举报
文章被收录于专栏:优雅R优雅R

r的future包提供了一种实现多线程并行计算的接口,但有时候在使用时,我发现r启动了比我设定的多得多的计算资源。

简单举一个例子:

data = data.table(
  v1 = rnorm(1e8),
  v2 = sample(LETTERS, size = 1e8, replace = TRUE)
)

library(future.apply)
plan(multisession, workers = 10)
rv = future_lapply(split(data, data$v2), function(x) {
  
  data.table(
    mean = mean(x$v1),
    sd = sd(x$v1)
  )
})
rv

上面我启用了10个线程(workers)对数据进行处理,但实际运行的时候CPU的资源图可以会类似下面这样:

有时候计算很密集的话,系统的全部CPU都会被占满。

在很久之前我就问过future包的作者,讨论在:https://github.com/HenrikBengtsson/future/issues/343

R语言大神任坤做了一段非常好的解释:

理解起来就是:

  1. 首先问题不是出在future上面,它只是一个管理器之类的东西,启动并行资源最后收集结果。
  2. 问题的核心在于R很多包或者底层库在你不知道的情况下启动了并行计算,例如data.table。举一个例子就是,如果你指定了4个worker,你只想使用4个CPU核心计算,但如果并行计算的内容函数使用了像data.table包的操作,而默认情况下data.table为了加速计算会使用系统全部的核心数目(假设一共20)。也就是你启动的每一个并行计算内容下都会使用全部的CPU核心数运算(4x20 >> 20),自然系统的资源都被占满了。

如@mxblsdl展示的例子,就可以手动进行设定解决这样的问题,即并行计算的函数开头设定仅只使用单线程(这样就变成了 4x1 = 4)。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 优雅R 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档