合并真的不是那么大的data.tables立即导致R被杀死

时间:2014-02-06 00:11:26

标签: r memory data.table

我在这台机器上有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。

1 个答案:

答案 0 :(得分:11)

更新:已在v1.8.11的提交1123中修复此问题。来自NEWS

  

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.tablefactor列以及零行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