tl; dr:真正长度超额分配警告后有哪些潜在问题?
最近我做了一些像这样的蠢事:
m <- matrix(seq_len(1e4),nrow=10)
library(data.table)
DT <- data.table(id=rep(1:2,each=5),m)
DT[,id2:=id]
#Warning message:
# In `[.data.table`(DT, , `:=`(id2, id)) :
# tl (2002) is greater than 1000 items over-allocated (ncol = 1001).
# If you didn't set the datatable.alloccol option very large,
# please report this to datatable-help including the result of sessionInfo().
DT[,lapply(.SD,mean),by=id2]
经过一些搜索后,显而易见的是,警告是通过引用一个包含太多列的data.table来添加列而得到的,我发现了一些相当技术性的解释(例如,this),我可能不会这样做完全明白。
我知道我可以避免这个问题(例如,使用data.table(id=rep(1:2,each=5),stack(as.data.frame(m)))
),但是我想知道在这样的警告之后我是否应该预料到问题(除了使用宽格式数据明显的性能劣势之外)。表)。
R version 2.15.3 (2013-03-01)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=German_Germany.1252 LC_CTYPE=German_Germany.1252 LC_MONETARY=German_Germany.1252 LC_NUMERIC=C LC_TIME=German_Germany.1252
attached base packages:
[1] stats graphics grDevices datasets utils methods base
other attached packages:
[1] data.table_1.8.8 fortunes_1.5-0
答案 0 :(得分:4)
好问题。默认情况下,在v1.8.8中:
> options()$datatable.alloccol
max(100, 2 * ncol(DT))
这可能不是最好的默认值。尝试更改它:
options(datatable.alloccol = quote(max(100L, ncol(DT)+64L))
更新:我现在已将v1.8.9中的默认值更改为。
该选项只控制分配了多少个备用列指针槽,以便:=
可以通过引用添加列。
来自NEWS中的NOTES for v1.8.9
datatable.alloccol
的默认值已从max(100L, 2L*ncol(DT))
更改为max(100L, ncol(DT)+64L)
。并且指向?truelength
的指针已添加到错误消息中,如同建议并且感谢Roland:
Potential problems from over-allocating truelength more than 1000 times