我在这台机器上有32GB的ram,但我可以比任何人更快地杀死R;)
这里的目标是使用利用data.table效率的函数来实现两个data.tables的rbind()
。
输入:
rm(list=ls())
gc()
输出:
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 1604987 85.8 2403845 128.4 2251281 120.3
Vcells 3019405 23.1 537019062 4097.2 468553954 3574.8
输入:
tmp.table <- data.table(X1=sample(1:7,4096000,replace=TRUE),
X2=as.factor(sample(1:2,4096000,replace=TRUE)),
X3=sample(1:1000,4096000,replace=TRUE),
X4=sample(1:256,4096000,replace=TRUE),
X5=sample(1:16,4096000,replace=TRUE),
X6=rnorm(4096000))
setkey(tmp.table,X1,X2,X3,X4,X5,X6)
join.table <- data.table(X1 = integer(), X2 = factor(),
X3 = integer(), X4=integer(),
X5 = integer(), X6 = numeric())
setkey(join.table,X1,X2,X3,X4,X5,X6)
tables()
输出:
NAME NROW MB COLS KEY
[1,] join.table 0 1 X1,X2,X3,X4,X5,X6 X1,X2,X3,X4,X5,X6
[2,] tmp.table 4,096,000 110 X1,X2,X3,X4,X5,X6 X1,X2,X3,X4,X5,X6
Total: 111MB
输入:
join.table <- merge(join.table,tmp.table,all.y=TRUE)
输出:
哈!不。 RStudio重启会话。
这里发生了什么?在join.table
中明确设置因子水平没有任何影响。 rbind()
代替merge()
没有帮助 - 完全相同的行为。我已经完成了与这些数据相关的更复杂和笨重的事情而没有任何问题。
$platform
[1] "x86_64-pc-linux-gnu"
$arch
[1] "x86_64"
$os
[1] "linux-gnu"
$system
[1] "x86_64, linux-gnu"
$version.string
[1] "R version 3.0.2 (2013-09-25)"
$nickname
[1] "Frisbee Sailing"
> rstudio::versionInfo()
$version
[1] ‘99.9.9’
$mode
[1] "server"
Data.table是版本1.8.11。
答案 0 :(得分:11)
o
rbindlist
至少有一个因子列以及至少一个空data.table
的存在导致 segfault (或者在linux / mac中报告了与之相关的错误哈希表)。现在已修复,#5355。感谢Trevor Alexander报告SO(以及mnel提交错误报告):merging really not that large data.tables immediately results in R being killed
这可以使用一行data.table
和factor
列以及零行data.table和因子列重现。
library(data.table)
A <- data.table(x=factor(1), key='x')
B <- data.table(x=factor(), key='x')
merge(B, A, all.y=TRUE)
# Rstudio -> R encountered fatal error
# R Gui -> R for windoze GUI has stopped working
使用debugonce(data.table:::merge.data.table)
这可以追溯到等同于
rbind(dt,yy)
rbind(B,A)
如果你运行它会产生同样的错误。
已向包裹作者报告此问题#5355