将CSV输出转换为数据帧的最快方法是什么?

时间:2013-05-17 03:07:16

标签: r

我有一个程序可以输出我要加载到数据框中的CSV数据行。 我目前正在加载数据:

tmpFilename <- "tmp_file"
system(paste(procName, ">", tmpFilename), wait=TRUE)
myData <- read.csv(tmpFilename) # (I also pass in colClasses and nrows for efficiency)

但是,我认为将输出重定向到文件只是为了从中读取它是低效的(程序吐出大约30MB,所以我想以最佳性能处理它)。我以为textConnection会解决这个问题,所以我试过了:

con <- textConnection(system(procName, intern=TRUE))
myData <- read.csv(con)

但运行速度慢得多,而第一个解决方案随输入大小线性降低,textConnection解决方案的性能似乎呈指数级下降。最慢的部分是创建textConnectionread.csv实际上比第一个解决方案更快完成,因为它是从内存中读取的。

我的问题是,创建一个文件只是为了运行read.csv就速度而言我最好的选择?有没有办法加快textConnection的创建?奖金:为什么创建textConnection这么慢?

1 个答案:

答案 0 :(得分:3)

“最快的方法”可能涉及使用read.csv之外的其他内容。但是,坚持使用read.csv,使用管道可能是要走的路:

myData <- read.csv(pipe(procName))

它避免将全文输出读入中间缓冲区(至少在read.csv获取它之前)。

一些时间比较:

> write.csv(data.frame(x=rnorm(1e5)), row.names=FALSE, file="norm.csv")
> system.time(d <- read.csv("norm.csv"))
   user  system elapsed 
  0.398   0.004   0.402 
> system.time(d <- read.csv(textConnection(system("cat norm.csv", intern=TRUE))))
   user  system elapsed 
 56.159   0.106  56.095 
> system.time(d <- read.csv(pipe("cat norm.csv")))
   user  system elapsed 
  0.475   0.012   0.531