我正在尝试尽快将CSV
文件的单个列读取到R
。我希望减少标准方法的时间,使列进入RAM的时间为10倍。
我的动机是什么?我有两个文件;一个名为Main.csv
,一个名为300000行和500列,一个名为Second.csv
,即300000行和5列。如果我system.time()
命令read.csv("Second.csv")
,则需要2.2秒。现在,如果我使用以下两种方法中的任何一种来读取Main.csv
的第一列(其大小为Second.csv
的20%,因为它是1列而不是5),它将花费超过40秒。 这与读取整个600兆字节文件的时间相同 - 显然是不可接受的。
方法1
colClasses <- rep('NULL',500)
colClasses[1] <- NA
system.time(
read.csv("Main.csv",colClasses=colClasses)
) # 40+ seconds, unacceptable
方法2
read.table(pipe("cut -f1 Main.csv")) #40+ seconds, unacceptable
如何减少这段时间?我希望有一个R
解决方案。
答案 0 :(得分:13)
我建议
scan(pipe("cut -f1 -d, Main.csv"))
这与原始提案(read.table(pipe("cut -f1 Main.csv"))
)的不同之处有两种:
cut
默认采用制表符分隔,因此您需要指定d,
以指定逗号分隔scan()
比read.table
快得多。根据OP的评论,这需要大约4秒而不是40秒。
答案 1 :(得分:8)
在此blog中读取大型CSV文件的方法速度比较。 fread 是最快的一个数量级。
如上面的评论所述,您可以使用select参数选择要读取的列 - 所以:
fread("main.csv",sep = ",", select = c("f1") )
将起作用