我有一个.csv文件:example.csv,包含8000列x 40000行。 csv文件的每列都有一个字符串标题。所有字段都包含0到10之间的整数值。当我尝试使用read.csv加载此文件时,结果非常慢。添加参数nrow = 100时速度也很慢。我想知道是否有办法加速read.csv,或使用其他函数而不是read.csv将文件作为矩阵或data.frame加载到内存中?
提前致谢。
答案 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: readr
与data.table
与vroom
对比,文件大小为1.57GB