14

我正在尝试尽快读取CSV文件的单个列R。我希望将标准方法减少 10 倍于将列放入 RAM 所需的时间。

我的动机是什么?我有两个文件;一个叫Main.csv300000 行 500 列,一个叫Second.csv300000 行 5 列。如果我system.time()执行命令read.csv("Second.csv"),则需要 2.2 秒。现在,如果我使用以下两种方法中的任何一种来读取第一列Main.csv(它的大小Second.csv是 1 列而不是 5 列的 20%),它将花费 40 多秒。这与读取整个 600 兆字节文件所需的时间相同——显然是不可接受的。

  • 方法一

    colClasses <- rep('NULL',500)
    
    colClasses[1] <- NA
    system.time(
    read.csv("Main.csv",colClasses=colClasses)
    ) # 40+ seconds, unacceptable
    
  • 方法二

     read.table(pipe("cut -f1 Main.csv")) #40+ seconds, unacceptable
    

如何减少这个时间?我希望有一个R解决方案。

4

2 回答 2

14

我会建议

scan(pipe("cut -f1 -d, Main.csv"))

这与最初的提案 ( read.table(pipe("cut -f1 Main.csv"))) 在几个不同的方面有所不同:

  • 由于文件是逗号分隔的,并且cut默认采用制表符分隔,因此您需要指定d,以指定逗号分隔
  • scan()read.table简单/非结构化数据读取要快得多。

根据 OP 的评论,这大约需要 4 秒而不是 40 多秒。

于 2013-11-02T16:36:06.887 回答
11

此博客中对读取大型 CSV 文件的方法进行了速度比较。 fread是最快的一个数量级。

正如上面评论中提到的,您可以使用 select 参数来选择要读取的列 - 所以:

fread("main.csv",sep = ",", select = c("f1") ) 

将工作

于 2014-02-12T09:49:58.070 回答