当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 使用foreach和%dopar%向数据框添加列

来源:互联网 收集:自由互联 发布时间:2021-06-22
在 Windows 7和Ubuntu 64位11.04的Revolution R 2.12.2中,我有一个超过100K行和超过100列的数据帧,我为每个原始列派生了~5列(sqrt,log,log10等)并将它们添加到同一数据框中.如果没有使用foreach和%do%
在 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%,则可以正常工作

data.table中尝试:=运算符以按引用添加列.您需要使用= FALSE,这样您就可以将调用粘贴到LHS上:=.

见When should I use the := operator in data.table?

网友评论