我有一个包含数百万个值的矩阵。 一列是一个奇怪的格式化日期,我将转换为我可以排序的实际日期时间。
我想加快速度并同时进行。在并行之前,我已经成功地做了一些小事,但这很容易,因为我没有积极地改变现有的矩阵。
我如何并行执行此操作?我似乎无法弄清楚......
我要并行化的代码是......
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)
似乎工作
答案 0 :(得分:1)
由于您只修改了combinedDF
的单个列,而gsub
和strptime
是向量函数,因此您无需使用循环或任何类型的“应用” “功能:
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()
的尝试应该比并行尝试更快地加速代码。