首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带plyr、MC的多核

带plyr、MC的多核
EN

Stack Overflow用户
提问于 2012-03-22 00:10:43
回答 2查看 2.2K关注 0票数 6

您好,我正在尝试使用R中的plyr库中的ddply,以及MC包。它似乎并没有加快计算速度。这是我运行的代码:

代码语言:javascript
复制
require(doMC)
registerDoMC(4)
getDoParWorkers()
##> 4
test <- data.frame(x=1:10000, y=rep(c(1:20), 500))
system.time(ddply(test, "y", mean))
  # user  system elapsed 
  # 0.015   0.000   0.015
system.time(ddply(test, "y", mean, .parallel=TRUE))
  # user  system elapsed 
  # 223.062   2.825   1.093 

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-22 00:19:43

相对于将拆分部分分配到每个核心并检索结果所需的通信成本而言,mean函数运行得太快了。

这是人们在分布式计算中遇到的常见“问题”。他们希望它能让一切运行得更快,因为他们忘记了成本(节点之间的通信)和好处(使用多核)。

plyr中特定于并行处理的东西:只有函数在多个内核上运行。拆分和合并仍然是在单个内核上完成的,所以当并行使用plyr函数时,您所应用的函数必须具有非常高的计算密集度才能看到好处。

票数 10
EN

Stack Overflow用户

发布于 2013-03-08 15:17:36

继续Joshua的回答,如果你想加快这个操作,有一个解决方案。它的灵感来自Map-reduce思想,不久前我在一个样本数据集上做了一个POC。

我使用了雪花库--我相信你也可以使用doMC。

代码语言:javascript
复制
# On my phone, please pardon typos/bugs

test <- data.frame(x=1:1000000, y=rep(c(1:20), 500))

testList = list()
testList[[1]] <- test[c(1:250000),]
testList[[2]] <- test[c(250001:500000),]
testList[[3]] <- test[c(500001:750000),]
testList[[4]] <- test[c(750001:1000000),]

# Write a function for the above - Need to find optimum number of splits

sfInit(parallel = TRUE, cpus=4)
sfCluster(plyr)
meanList = sfClusterSpplyLB(testList, function(x) ddply(test, "y", mean))

sfStop()

aggregate(meanList, by=list(y), FUN=mean)

这可能会对您有所帮助,因为我们现在正在以分布式方式执行split-combine例程。这适用于当分割大小相同的时候,它适用于和,最小/最大,计数等,但是有一些操作我们不能使用它。

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

https://stackoverflow.com/questions/9808495

复制
相关文章

相似问题

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