您好我正在尝试使用ddply
包中的plyr
库中的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
有什么想法吗?
答案 0 :(得分:10)
相对于将拆分部分分配到每个核心并检索结果所需的通信成本,mean
函数的运行速度过快。
这是人们在分布式计算中遇到的常见“问题”。他们希望它能让一切运行得更快,因为他们忘记了成本(节点之间的通信)以及好处(使用多个核心)。
plyr中并行处理的特定内容:只有该函数在多个内核上运行。拆分和组合仍然在单个核心上完成,因此当您并行使用plyr函数时,您正在应用的函数必须非常计算密集才能看到好处。
答案 1 :(得分:1)
继续约书亚的回答,如果你想加快这项行动,可以解决这个问题。它的灵感来自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)
这个可能可以帮助您,因为我们现在正在以分布式方式执行拆分组合例程。这适用于分割大小相同的情况,它适用于总和,最小/最大,计数等都可以,但有一些操作我们不能用它。