data.table中的列插槽

时间:2018-12-06 17:19:08

标签: r data.table

我有一个具有350m行和4列的数据集x。从13m行和19列的数据集i连接两列时,遇到以下错误:

Internal logical error. DT passed to assign has not been allocated enough column slots. l=4, tl=4, adding 1

我检查了Not Enough Columns Slots,但问题似乎出在列数上。由于我只有几个人,如果这是问题,我会感到惊讶。

我还发现了https://github.com/Rdatatable/data.table/issues/1830,该错误与“列槽”有关,但我不知道它们是什么。检查truelength时,我得到

> truelength(x)
[1] 0
> truelength(i)
[1] 0

我的理解是,设置alloc.col(x,32)alloc.col(i,32)或两者都可以解决问题。但是,我不知道这样做是什么,问题是什么。谁能提供解释?

1 个答案:

答案 0 :(得分:2)

data.table如此高效的部分原因在于,它试图对内存使用情况保持精明(而base data.frames往往会在常规使用中最终左右复制,例如,设置names(DF) = col_names 实际上可以复制DF 的全部内容,尽管只需要操纵对象的属性即可。

部分原因是,data.table总是在内存中分配一定的大小,以允许更流畅地添加/减去列指针(从内存的角度来看)。

因此,尽管实际的占用内存贪婪地(创建它们时,声称有足够的内存来存储nrow(DT)大小的向量),但是 pointers 列,用于存储查找实际数据的地址(如果您不知道指针的严密细节,可以想到这个〜like〜列名),并在其上有一个固定的内存插槽创造。

alloc.col强制进行列指针地址保留过程;这是最常见的两种情况:

  1. 您的数据需要很多列(默认情况下,分配给1024个指针的空间比定义的列还要多)
  2. 您已从RDS加载了数据(由于readRDS / load在加载时不知道为data.table分配此内存,因此我们必须自己触发)< / li>

我认为弗兰克是对的,而您正在经历后者。有关更多详细信息,请参见?alloc.col,但是在大多数情况下,您应该只运行alloc.col(x)alloc.col(i) -除了高度受限的机器之外,它分配1024个列 pointers 需要相对较少的内存,因此您不应该花太多时间跳过并尝试找出合适的数量。