更快速地读取CSV文件的单列

时间:2013-11-02 15:05:35

标签: r performance optimization csv io

我正在尝试尽快将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解决方案。

2 个答案:

答案 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") ) 

将起作用