Foreach if循环

时间:2018-05-11 18:25:52

标签: r loops foreach bigdata

我有一个6000万行的数据集,想要计算每一行的比较。这是两个时间戳之间的简单时差。为了测试运行时间,我对100万行进行了计算,花了将近2分钟。我希望有更快的方法。

以下是一些示例数据。

library(data.table)

DT <- fread( 'unique_id,click_time,click_time2
100005361,2017-11-09 03:58:32,2017-11-09 03:59:33
100005372,2017-11-09 00:53:08,2017-11-09 00:53:40
100005373,2017-11-09 04:38:52,2017-11-09 04:38:53
100005374,2017-11-09 05:42:30,2017-11-09 05:44:30' )

这是我想要计算的基本指标:

DT$click_diff = difftime(DT$click_time,DT$click_time2,units=c("secs"))

如果我只是运行它,我认为它需要花费数小时,所以我尝试使用foreach()包,但我认为我犯了一个错误。

library(doParallel)
library(foreach)
cl <- makeCluster(parallel::detectCores()-1)
registerDoParallel(cl)   #create a cluster


r <-  foreach(i=1:nrow(DT) %dopar% {

results[i] = difftime(DT$click_time[i],DT$click_time_2[i],units=c("secs"))

return(data.frame(results))
}

parallel::stopCluster(cl)

群集肯定已经建立但没有任何事情发生。有没有人对如何修复此代码有任何建议,或者可能是另一种加速大数据集的时差计算的方法?

1 个答案:

答案 0 :(得分:2)

如果你利用R只是将时间表示为自给定时间(默认情况下1970年1月1日午夜)以来的秒数,这应该花费一些时间单线程。

生成数据:

library(data.table)

## Generate Data
RowCount <- 60e6
DT <- data.table(unique_id = seq_len(RowCount),
                 click_time = sample.int(1e5,size = RowCount, replace = TRUE),
                 duration = sample.int(1e2,size = RowCount, replace = TRUE))

DT[,click_time2 := click_time + duration]
DT[,duration := NULL]

DT[, click_time := as.POSIXct(click_time, tz = "UTC", origin = "1970-01-01 00:00:00")]
DT[, click_time2 := as.POSIXct(click_time2, tz = "UTC", origin = "1970-01-01 00:00:00")]


head(DT)
#    unique_id          click_time         click_time2
# 1:         1 1970-01-01 04:50:25 1970-01-01 04:51:08
# 2:         2 1970-01-02 00:53:50 1970-01-02 00:54:43
# 3:         3 1970-01-01 15:58:54 1970-01-01 15:59:18
# 4:         4 1970-01-01 22:36:32 1970-01-01 22:37:48
# 5:         5 1970-01-01 08:51:48 1970-01-01 08:52:17
# 6:         6 1970-01-01 12:24:15 1970-01-01 12:24:30

计算duration

system.time({
  DT[,duration := as.integer(click_time2) - as.integer(click_time) ]
})

# user  system elapsed 
# 0.700   0.069   0.772 
  

问题:即使您保留difftime课程并且不使用data.table语法,这仍然需要花费大量时间。你的电脑内存不足吗?

system.time({
  DT$click_diff = difftime(DT$click_time,DT$click_time2,units=c("secs"))
})

#   user  system elapsed 
#  1.796   0.653   2.452 

head(DT)
#    unique_id          click_time         click_time2 duration
# 1:         1 1970-01-01 21:27:49 1970-01-01 21:29:00  71 secs
# 2:         2 1970-01-01 16:56:37 1970-01-01 16:58:04  87 secs
# 3:         3 1970-01-01 16:30:53 1970-01-01 16:31:28  35 secs
# 4:         4 1970-01-01 21:00:30 1970-01-01 21:01:57  87 secs
# 5:         5 1970-01-01 17:27:53 1970-01-01 17:28:19  26 secs
# 6:         6 1970-01-01 07:52:49 1970-01-01 07:53:19  30 secs