使用大数据加速 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) 我在 fread
和 colClasses="POSIXct"
方面做错了什么,或者 2) 如果有其他 ways/packages 来加速转换data.table
列到 POSIXct?
谢谢。
我建议两个选项。
我假设你使用 write.csv
或类似的,在写出来时将 POSIXct
转换为 character
。这会减慢写出和读入的速度,因为 POSIXct
对象实际上是数字而不是字符(更准确地说,它们是自 "epoch" 以来的秒数)。所以你可以把这个列转换成numeric
,然后写出来,读入后再转换回POSIXct
(会超级快)
如果您更喜欢写出字符列,另一种选择是使用 fastPOSIXct
从 fasttime
加速到 POSIXct
的转换。
我正在尝试从大型 .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.
谁能告诉我,如果 1) 我在 fread
和 colClasses="POSIXct"
方面做错了什么,或者 2) 如果有其他 ways/packages 来加速转换data.table
列到 POSIXct?
谢谢。
我建议两个选项。
我假设你使用 write.csv
或类似的,在写出来时将 POSIXct
转换为 character
。这会减慢写出和读入的速度,因为 POSIXct
对象实际上是数字而不是字符(更准确地说,它们是自 "epoch" 以来的秒数)。所以你可以把这个列转换成numeric
,然后写出来,读入后再转换回POSIXct
(会超级快)
如果您更喜欢写出字符列,另一种选择是使用 fastPOSIXct
从 fasttime
加速到 POSIXct
的转换。