red.Linux上的data.table R fwrite bug

时间:2017-01-30 17:32:23

标签: r data.table

我一直在使用data.table(v1.10)并注意到使用fwrite时的一个错误。一些背景。

sessionInfo()
R version 3.1.3 (2015-03-09)
Platform: x86_64-unknown-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux Server release 6.7 (Santiago)

拥有多核机器。

  

生成一些数据

#Generate some data
rows = 2500000
set.seed(Sys.time())
DF <- data.frame(index = 1:rows,
             catsA = sample((letters[1:10]),rows,replace=T),
             catsB = sample((letters[1:10]),rows,replace=T),
             catsC = sample((letters[1:10]),rows,replace=T),
             catsD = sample((letters[1:10]),rows,replace=T),
             catsE = sample((letters[1:10]),rows,replace=T),
             valueA = round(rnorm(rows),3),
             valueB = rpois(rows, lambda = 4))

#Convert to data.table
DT <- data.table(DF) 
#Create a new column
DT <- DT[,valueNew := valueA*valueB]

#Write
write.csv(DT,file="DT_write_csv.csv",row.names=F)
fwrite(DT, file = "DT_fwrite.csv",row.names=F)
  

继续阅读并加入

#Read back in and join
DT_csv <- fread("DT_write_csv.csv")
DT_fwrite <- fread("DT_fwrite.csv")

setkey(DT_csv,"index")
setkey(DT_fwrite,"index")
join_DT <- DT_csv[DT_fwrite]
  

比较

nrow(join_DT[valueNew != i.valueNew])
[1] 1
join_DT[valueNew != i.valueNew,.(index,valueNew,i.valueNew)]
   index valueNew i.valueNew
1: 67097    2.855       5.71
DT[index==67097,.(valueNew)]
   valueNew
1:    2.855 

比较,原始DT具有fwrite腐败的a。有时,它不止一行,而且在一个真实的例子中传播了很多列。

我是否对fwrite做错了什么?

1 个答案:

答案 0 :(得分:3)

是的,fwrite中存在错误。上周在开发中修复,我很快就会尝试将它送到CRAN。请查看主页顶部的NEWS链接,错误修正项目3:

  

fwrite()可能会错误地写入浮点值#1968。一个   线程局部变量错误地是线程全局的。这个变量   使用寿命只有几个时钟周期,因此需要大量数据   多个线程的许多线程重叠它们的使用和   导致问题。非常感谢@mgahan和@jmosser的发现和   报告。

请输入命令here从dev中尝试。我知道dev目前正在失败Travis(一个无关的原因),这就是安装命令已经设置为从dev安装最后传递提交的原因,因此应该没问题。

相关问题