我有一个程序输出我想要加载到数据框中的CSV数据行.我目前正在加载数据:
tmpFilename <- "tmp_file"
system(paste(procName, ">", tmpFilename), wait=TRUE)
myData <- read.csv(tmpFilename) # (I also pass in colClasses and nrows for efficiency)
Run Code Online (Sandbox Code Playgroud)
但是,我认为将输出重定向到文件只是为了从中读取它是低效的(程序吐出大约30MB,所以我想以最佳性能处理它).我以为textConnection
会解决这个问题,所以我尝试过:
con <- textConnection(system(procName, intern=TRUE))
myData <- read.csv(con)
Run Code Online (Sandbox Code Playgroud)
然而,运行速度要慢得多,而第一种解决方案随着输入大小线性降低,textConnection
解决方案的性能似乎呈指数级下降.最慢的部分是创造textConnection
.read.csv
这里实际上比第一个解决方案更快,因为它是从内存中读取的.
我的问题是,创建一个文件只是为了read.csv
在它上面运行我的速度方面的最佳选择?有没有办法加快textConnection的创建?奖金:为什么创建textConnection这么慢?
“最快的方法”可能涉及使用 read.csv 以外的其他方法。然而,坚持使用 read.csv,使用管道可能是可行的方法:
myData <- read.csv(pipe(procName))
Run Code Online (Sandbox Code Playgroud)
它避免将全文输出读入中间缓冲区(至少在 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
398 次 |
最近记录: |