我有一个具有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)
或两者都可以解决问题。但是,我不知道这样做是什么,问题是什么。谁能提供解释?
答案 0 :(得分:2)
data.table
如此高效的部分原因在于,它试图对内存使用情况保持精明(而base
data.frames
往往会在常规使用中最终左右复制,例如,设置names(DF) = col_names
实际上可以复制DF
的全部内容,尽管只需要操纵对象的属性即可。
部分原因是,data.table
总是在内存中分配一定的大小,以允许更流畅地添加/减去列指针(从内存的角度来看)。
因此,尽管实际的列占用内存贪婪地(创建它们时,声称有足够的内存来存储nrow(DT)
大小的向量),但是 pointers 列,用于存储查找实际数据的地址(如果您不知道指针的严密细节,可以想到这个〜like〜列名),并在其上有一个固定的内存插槽创造。
alloc.col
强制进行列指针地址保留过程;这是最常见的两种情况:
readRDS
/ load
在加载时不知道为data.table
分配此内存,因此我们必须自己触发)< / li>
我认为弗兰克是对的,而您正在经历后者。有关更多详细信息,请参见?alloc.col
,但是在大多数情况下,您应该只运行alloc.col(x)
和alloc.col(i)
-除了高度受限的机器之外,它分配1024个列 pointers 需要相对较少的内存,因此您不应该花太多时间跳过并尝试找出合适的数量。