R - 使用并行代码(doParallel)时更新Matrix中的值

时间:2016-03-21 21:34:41

标签: r matrix parallel-processing

我有一个包含数百万个值的矩阵。 一列是一个奇怪的格式化日期,我将转换为我可以排序的实际日期时间。

我想加快速度并同时进行。在并行之前,我已经成功地做了一些小事,但这很容易,因为我没有积极地改变现有的矩阵。

我如何并行执行此操作?我似乎无法弄清楚......

我要并行化的代码是......

len = dim(combinedDF)[1]
for(j in 1:len)
{
    sendTime = combinedDF[j, "tweetSendTime"]
    sendTime = gsub(" 0000", " +0000", sendTime)
    updatedTime = strptime( sendTime, "%a %b %d %H:%M:%S %z %Y")
    combinedDF[j, "tweetSendTime"] = toString(updatedTime)
}
编辑:我被告知也尝试申请。我试过......

len = dim(combinedDF)[1]
### Using apply
apply(combinedDF,1, function(combinedDF,y){
sendTime = combinedDF[y, "tweetSendTime"]
sendTime = gsub(" 0000", " +0000", sendTime)
updatedTime = strptime( sendTime, "%a %b %d %H:%M:%S %z %Y")
combinedDF[y, "tweetSendTime"] = toString(updatedTime)
combinedDF[y,]
}, y=1:len)

然而,当},进程,给我"组合DF中的错误[y," tweetSendTime"] - 维度数量不正确时,会出错。

编辑:

updateTime = function(timeList){
sendTime = timeList
sendTime = gsub(" 0000", " +0000", sendTime)
updatedTime = strptime( sendTime, "%a %b %d %H:%M:%S %z %Y")
toString(updatedTime)
} 


apply(as.matrix(combinedDF[,"tweetSendTime"]),1,updateTime)

似乎工作

2 个答案:

答案 0 :(得分:1)

由于您只修改了combinedDF的单个列,而gsubstrptime是向量函数,因此您无需使用循环或任何类型的“应用” “功能:

sendTime <- gsub(" 0000", " +0000", combinedDF[, "tweetSendTime"])
updatedTime <- strptime(sendTime, "%a %b %d %H:%M:%S %z %Y")
combinedDF[, "tweetSendTime"] <- as.character(updatedTime)

请注意,我使用as.character,因为它是矢量函数,而toString则不是。

答案 1 :(得分:0)

我通常使用doParallel进行并行执行:

library(doParallel)
ClusterCount = 2 # depends on the threads you want to use
cl <- makeCluster(ClusterCount)
registerDoParallel(cl)
len = dim(combinedDF)[1]
combinedDF <- foreach(j = 1:len,.combine = rbind) %dopar% {
    sendTime = combinedDF[j, "tweetSendTime"]
    sendTime = gsub(" 0000", " +0000", sendTime)
    updatedTime = strptime( sendTime, "%a %b %d %H:%M:%S %z %Y")
    combinedDF[j, "tweetSendTime"] = toString(updatedTime)
    combinedDF[j,]
}
stopCluster(cl)
然而,应该提到的是,你所做的事情似乎并不是计算上昂贵的,而是需要多次迭代。您应该考虑重写代码,因为R中的循环速度不是很快,基于apply()的尝试应该比并行尝试更快地加速代码。