我有一个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)
群集肯定已经建立但没有任何事情发生。有没有人对如何修复此代码有任何建议,或者可能是另一种加速大数据集的时差计算的方法?
答案 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