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

bri*_*tar 8 memory r data.table

我在这台机器上有32GB的ram,但我可以比任何人更快地杀死R;)

这里的目标是rbind()使用利用data.table效率的函数来实现两个data.tables.

输入:

rm(list=ls())
gc()
Run Code Online (Sandbox Code Playgroud)

输出:

          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
Run Code Online (Sandbox Code Playgroud)

输入:

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()
Run Code Online (Sandbox Code Playgroud)

输出:

     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
Run Code Online (Sandbox Code Playgroud)

输入:

join.table <- merge(join.table,tmp.table,all.y=TRUE)
Run Code Online (Sandbox Code Playgroud)

输出:

哈!不.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"
Run Code Online (Sandbox Code Playgroud)

Data.table是版本1.8.11.

mne*_*nel 11

更新:这已在v1.8.11的 commit 1123中修复.来自新闻:

ø rbindlist与至少一个空的存在沿着至少一个因子列data.table导致段错误(或在linux/MAC报对散列表的相关错误).现在已修复,#5355.感谢Trevor Alexander报告SO(以及mnel提交错误报告):合并真的不是那么大的data.tables立即导致R被杀死


这可以用一个单一的行被再现 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
Run Code Online (Sandbox Code Playgroud)

使用debugonce(data.table:::merge.data.table)这个可以追溯到rbind(dt,yy)相当于的线

rbind(B,A)
Run Code Online (Sandbox Code Playgroud)

如果你运行它,它将给出相同的错误.

已经向包裹作者报告了问题#5355