使用大数据加速 as.POSIXct / 在 data.table 中存储为 POSIXct 时出现问题

speeding up as.POSIXct with large data / issue with storing as POSIXct in data.table

我正在尝试从大型 .csv(~1100 万行)中提取 POSIXct 登录时间列表,然后使用 cut 函数列出每 15 分钟的登录次数堵塞。

鉴于数据集的大小,我正在使用 data.table 函数。我已经设法实现了我的 objective,但是我 运行 遇到了下面描述的一些问题:

#selective fread dt <- fread("foo.csv", colClasses=list(NULL=c(1:5,8:14), "POSIXct"=c(5,6)) )

问题:我试图将 2 个相关列存储为 POSIXct classes,但它似乎存储为 character class:

> class(dt$login_datetime) [1] "character"

我通过使用 as.POSIXct 设法 运行 我的其余代码,如下所示:

timeLog <- dt[,1, with=FALSE] timeLog<- timeLog[,login_datetime:=as.POSIXct(login_datetime)] tabulate <- data.frame(table(cut(timeLog, breaks="15 mins")))

然而,第二行在我的机器上 运行 大约需要 12 分钟。我需要以类似的方式处理更多的数据集,虽然 12 分钟并不是非常慢,但我很好奇我是否可以加快这个过程(没有硬件升级)。

具体来说,我试图让 fread 将相关列直接存储为 POSIXct classes,但无法做到。我无法在 data.table vignette here.

中找到任何关于 POSIXct 的信息

谁能告诉我,如果 1) 我在 freadcolClasses="POSIXct" 方面做错了什么,或者 2) 如果有其他 ways/packages 来加速转换data.table 列到 POSIXct?

谢谢。

我建议两个选项。

我假设你使用 write.csv 或类似的,在写出来时将 POSIXct 转换为 character。这会减慢写出和读入的速度,因为 POSIXct 对象实际上是数字而不是字符(更准确地说,它们是自 "epoch" 以来的秒数)。所以你可以把这个列转换成numeric,然后写出来,读入后再转换回POSIXct(会超级快)

如果您更喜欢写出字符列,另一种选择是使用 fastPOSIXctfasttime 加速到 POSIXct 的转换。