将大型平面文件读入r as.numeric的快速方法



我有一个大的(450MB/2.5亿行)由1和0组成的平面文件,看起来像这样…

    1
    0
    0
    1
    0
    1
    0
    etc...

我正在使用以下方法将其读入R…

dat <- as.numeric(readLines("my_large_file"))

我得到所需的数据结构,但它需要很长时间。有什么建议更快的方法来实现相同的结果?

NB。保持1和0的顺序很重要。我会考虑在python或unix命令行中使用选项,但最终的数据结构需要在R中绘制图形。

对于只希望返回向量的数字文件,使用scan可能会做得更好。

scan("my_large_file", what = integer())

what参数将进一步加快读取文件的速度(而不是忽略它),因为您有效地告诉R它将读取整数值。scan还有许多其他的参数,在处理大型数字文件时会派上用场(例如skip, nlines等)

此外,正如@baptiste在评论中提到的,

library(data.table)
fread("my_large_file")

readLinesscan(在我的机器上)都吹走了。

注意:可能是一个错别字,但在你的原始帖子中,我认为readlines应该是readLines

时序比较两个选项。首先是一些数据。

set.seed(21)
x <- sample.int(2, 25e6, TRUE) - 1L
writeLines(as.character(x),"data")

现在,一些基准测试(每次从一个新的R会话运行,以避免文件被缓存)。

> system.time(r <- as.numeric(readLines("data")))
   user  system elapsed 
  5.235   0.447   5.681 
> system.time(r <- scan("data",what=numeric()))
Read 25000000 items
   user  system elapsed 
  4.199   0.286   4.483 
> system.time(r <- scan("data",what=integer()))
Read 25000000 items
   user  system elapsed 
  3.134   0.081   3.214
> require(data.table)
> system.time(r <- fread("data")$V1)
   user  system elapsed 
  0.412   0.026   0.439 

和验证:

> num <- as.numeric(readLines("data"))
> int <- as.integer(readLines("data"))
> sn <- scan("data",what=numeric())
Read 25000000 items
> si <- scan("data",what=integer())
Read 25000000 items
> dti <- fread("data")$V1
> identical(num,sn)
[1] TRUE
> identical(int,si)
[1] TRUE
> identical(int,dti)
[1] TRUE

相关内容

最新更新