5

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を参照して列を追加した結果であることが明らかになり、かなり技術的な説明(たとえば、これ)が見つかりましたが、おそらく完全には理解していません。

この問題を回避できることはわかっていますが(たとえば、use data.table(id=rep(1:2,each=5),stack(as.data.frame(m))))、そのような警告の後に問題が発生する可能性があるのではないかと思います(ワイドフォーマットのdata.tableを使用することによる明らかなパフォーマンスの低下以外)。

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  
4

1 に答える 1

6

良い質問。v1.8.8のデフォルト:

> options()$datatable.alloccol
max(100, 2 * ncol(DT))

これはおそらく最良のデフォルトではありません。変更してみてください:

options(datatable.alloccol = quote(max(100L, ncol(DT)+64L))

更新:v1.8.9のデフォルトをそれに変更しました。

このオプションは:=、参照によって列を追加できるように、割り当てられる予備の列ポインタースロットの数を制御するだけです。


v1.8.9のニュースのメモから

于 2013-03-15T16:57:06.627 に答える