【问题标题】:Data.table size increases manifolds after performing operation on column对列执行操作后,Data.table 大小增加了流形
【发布时间】:2018-05-25 04:47:34
【问题描述】:

我有一个data.table score大小900MB的。有一列datetime这实质上是在格式@ 987654324日期时间@。我试图将类转换character这个特殊的列到POSIXlt使用下面的代码: P>

score[,newdate := as.POSIXlt.character(score[["datetime"]],tz="IST",format="%Y-%m-%d %H:%M:%S")][,datetime:=NULL]

此操作使尺寸211 GB的data.table。这里发生了什么。请帮忙。

dput(head(score))

structure(list(id1 = c(12234398L, 323437283L, 12343344L, 
545465653L, 312342343L, 22344232L), id2 = c(216231535L, 
324345453L, 345474698L, 87787950L, 656565531L, 565656657L), 
Score = c(756L, 777L, 788L, 234L, 656L, 788L), datetime = c("2017-05-08 00:00:00.0000000", 
"2018-07-12 01:24:46.0000000", "2015-16-02 00:00:00.0000000", 
"2016-03-22 23:06:45.0000000", "2016-07-14 12:23:45.0000000", 
"2014-05-03 03:33:13.0000000")), .Names = c("id1", 
"id2", "Score", "datetime"), class = c("data.table", 
"data.frame"), row.names = c(NA, -6L), .internal.selfref = <pointer: 
0x190cc98>)

【问题讨论】:

  • 你没有得到任何预警tz="IST"? SPAN>
  • @ MKR号为什么你认为它应该抛出一个警告? SPAN>
  • stackoverflow.com/questions/21487614/…我认为这可能是您的问题。 SPAN>
  • @ TUSHAR我认为问题是使用的score[["datetime"]]。它的创建selfreference。为什么不能使用datetime代替? SPAN>
  • @ MKR它不是问题,其POSIXlt格式跨度>

标签: r data.table


【解决方案1】:

参考这个link

data.table 不接受 POSIXlt 列。您可以使用POSIXct 代替POSIXlt

score[, newdate := as.POSIXct(datetime, tz = "IST", format = "%Y-%m-%d %H:%M:%S")][, datetime := NULL]

【讨论】:

  • 非常感谢。这很好用。事实上,它导致 data.table 的大小减小。
【解决方案2】:

解释一下为什么data.table 增长如此之快:

d <- as.POSIXlt.character("2017-05-08 00:00:00.0000000", ,tz="IST",format="%Y-%m-%d %H:%M:%S")
d
object.size(d) # 2024 Bytes in my configuration
# 2024 bytes

?POSIXlt 这么说

“POSIXlt”类是一个命名的向量列表,表示...

这意味着每个POSIXlt 对象都包含许多表示日期和时间组件的元素。

这会消耗大量内存(不记得了,但每个 POSIXlt 元素大约 80 字节 + 向量结构的开销)。

data.table 的赋值运算符对列表进行了特殊处理(每个列表元素被分配到不同的列),因此您的代码 sn-p 会收到警告,例如:

警告信息: 在[.data.table(data, , :=(newdate, as.POSIXlt.character(data[["datetime"]], : 提供 11 项分配给列 'newdate' 的 6 项(5 未使用)

【讨论】:

  • 感谢您的解释。我在@zacdav 共享的链接之一中读到,每个 POSIXlt 元素占用大约 40 字节的内存。
猜你喜欢
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多