【发布时间】:2011-12-16 02:36:15
【问题描述】:
在 Windows 7 和 Ubuntu 64 位 11.04 上的 Revolution R 2.12.2 中,我有一个包含超过 100K 行和超过 100 列的数据框,并且我为每一列派生了大约 5 列(sqrt、log、log10 等)原始列并将它们添加到同一数据框中。如果没有使用 foreach 和 %do% 的并行性,这可以正常工作,但速度很慢。当我尝试将它与 foreach 和 %dopar% 并行化时,它不会访问全局环境(以防止竞争条件或类似情况),因此我无法修改数据框,因为“找不到数据框对象”。
我的问题是我怎样才能加快速度?换句话说,如何并行化列或转换?
简化示例:
require(foreach)
require(doSMP)
w <- startWorkers()
registerDoSMP(w)
transform_features <- function()
{
cols<-c(1,2,3,4) # in my real code I select certain columns (not all)
foreach(thiscol=cols, mydata) %dopar% {
name <- names(mydata)[thiscol]
print(paste('transforming variable ', name))
mydata[,paste(name, 'sqrt', sep='_')] <<- sqrt(mydata[,thiscol])
mydata[,paste(name, 'log', sep='_')] <<- log(mydata[,thiscol])
}
}
n<-10 # I often have 100K-1M rows
mydata <- data.frame(
a=runif(n,1,100),
b=runif(n,1,100),
c=runif(n,1,100),
d=runif(n,1,100)
)
ncol(mydata) # 4 columns
transform_features()
ncol(mydata) # if it works, there should be 8
请注意,如果您将 %dopar% 更改为 %do%,它可以正常工作
【问题讨论】:
标签: performance r foreach parallel-processing