read.csv在读取包含大量列的csv文件时非常慢

时间:2011-09-07 01:03:41

标签: r csv

我有一个.csv文件:example.csv,包含8000列x 40000行。 csv文件的每列都有一个字符串标题。所有字段都包含0到10之间的整数值。当我尝试使用read.csv加载此文件时,结果非常慢。添加参数nrow = 100时速度也很慢。我想知道是否有办法加速read.csv,或使用其他函数而不是read.csv将文件作为矩阵或data.frame加载到内存中?

提前致谢。

5 个答案:

答案 0 :(得分:16)

如果您的CSV仅包含整数,则应使用scan代替read.csv,因为?read.csv说:

 ‘read.table’ is not the right tool for reading large matrices,
 especially those with many columns: it is designed to read _data
 frames_ which may have columns of very different classes.  Use
 ‘scan’ instead for matrices.

由于您的文件有标题,因此您需要skip=1,如果设置what=integer(),它可能会更快。如果必须使用read.csv并且速度/内存消耗是一个问题,设置colClasses参数是一个巨大的帮助。

答案 1 :(得分:9)

尝试使用fread{data.table}。到目前为止,这是将.csv个文件读入R的最快方法。有一个good benchmark here

library(data.table)

data <- fread("c:/data.csv")

如果您想让它更快,您还可以只读取您要使用的列子集:

data <- fread("c:/data.csv", select = c("col1", "col2", "col3"))

答案 2 :(得分:5)

同时尝试Hadley Wickham的readr包裹:

library(readr) 
data <- read_csv("file.csv")

答案 3 :(得分:3)

如果您经常阅读该文件,则可能需要使用save函数以二进制格式从R保存它。指定compress=FALSE通常会加快加载时间。

...然后您可以使用(surprise!)load函数加载它。

d <- as.data.frame(matrix(1:1e6,ncol=1000))
write.csv(d, "c:/foo.csv", row.names=FALSE)

# Load file with read.csv
system.time( a <- read.csv("c:/foo.csv") ) # 3.18 sec

# Load file using scan
system.time( b <- matrix(scan("c:/foo.csv", 0L, skip=1, sep=','), 
                         ncol=1000, byrow=TRUE) ) # 0.55 sec

# Load (binary) file using load
save(d, file="c:/foo.bin", compress=FALSE)
system.time( load("c:/foo.bin") ) # 0.09 sec

答案 4 :(得分:1)

尝试新的vroom软件包

是值得的
  

vroom是一种将定界和定宽数据读入R的新方法。

     

基于以下观察:解析文件时,从磁盘读取数据并找到分隔符通常不是主要瓶颈。取而代之的是(重新)分配内存并将值解析为R数据类型(尤其是对于字符),这会花费大量时间。

     

因此,您可以先执行快速索引步骤,然后使用R版本3.5+中可用的ALTREP(替代表示)框架以惰性/延迟方式访问值,从而获得非常快速的输入。

     

此方法还可能允许您处理大于内存的数据。只要小心避免立即实现整个数据集,就可以对其进行有效查询和子集化。

#install.packages("vroom", 
#                 dependencies = TRUE, repos = "https://cran.rstudio.com")
library(vroom)

df <- vroom('example.csv')

Benchmark: readrdata.tablevroom对比,文件大小为1.57GB