您好,我正在尝试使用R中的plyr库中的ddply,以及MC包。它似乎并没有加快计算速度。这是我运行的代码:
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 有什么想法吗?
发布于 2012-03-22 00:19:43
相对于将拆分部分分配到每个核心并检索结果所需的通信成本而言,mean函数运行得太快了。
这是人们在分布式计算中遇到的常见“问题”。他们希望它能让一切运行得更快,因为他们忘记了成本(节点之间的通信)和好处(使用多核)。
plyr中特定于并行处理的东西:只有函数在多个内核上运行。拆分和合并仍然是在单个内核上完成的,所以当并行使用plyr函数时,您所应用的函数必须具有非常高的计算密集度才能看到好处。
发布于 2013-03-08 15:17:36
继续Joshua的回答,如果你想加快这个操作,有一个解决方案。它的灵感来自Map-reduce思想,不久前我在一个样本数据集上做了一个POC。
我使用了雪花库--我相信你也可以使用doMC。
# 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例程。这适用于当分割大小相同的时候,它适用于和,最小/最大,计数等,但是有一些操作我们不能使用它。
https://stackoverflow.com/questions/9808495
复制相似问题