我有一个.csv文件:example.csv,包含8000列x 40000行。 csv文件的每个列都有一个字符串标题。所有字段都包含0到10之间的整数值。当我尝试使用read.csv加载此文件时,它变得非常缓慢。当我添加一个参数nrow = 100时,它也很慢。我想知道是否有一种方法可以加速read.csv,或者使用其他函数而不是read.csv将文件作为矩阵或data.frame加载到内存中?read.csv在读取包含大量列的csv文件时速度非常慢
在此先感谢。
我有一个.csv文件:example.csv,包含8000列x 40000行。 csv文件的每个列都有一个字符串标题。所有字段都包含0到10之间的整数值。当我尝试使用read.csv加载此文件时,它变得非常缓慢。当我添加一个参数nrow = 100时,它也很慢。我想知道是否有一种方法可以加速read.csv,或者使用其他函数而不是read.csv将文件作为矩阵或data.frame加载到内存中?read.csv在读取包含大量列的csv文件时速度非常慢
在此先感谢。
如果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
参数非常有帮助。
如果您经常阅读该文件,可能需要使用save
函数以二进制格式从R中保存该文件。指定compress=FALSE
通常会导致更快的加载时间。
...您可以使用(惊喜!)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
尝试使用fread{data.table}
。这是迄今为止读入.csv
文件的最快方法。有一个good benchmark here。
library(data.table)
data <- fread("c:/data.csv")
如果你想让它再快,也可以只读取要使用的列的子集:
data <- fread("c:/data.csv", select = c("col1", "col2", "col3"))
fread在我的数据上立即崩溃(有超过一百万列) – shreyasgm
这很奇怪;我建议你卸载并重新安装库:。 install.packages(“data.table”)'。如果问题依然存在,您可能会考虑在项目网站上打开'issue'https://github.com/Rdatatable/data.table/wiki –
也可以尝试哈德利韦翰的readr
包:
library(readr)
data <- read_csv("file.csv")
请分享您正在使用的代码为read.csv - 提高性能有很多选项,请参阅?read.table – mdsumner