【发布时间】:2012-01-30 09:28:37
【问题描述】:
即使使用scan(..., what="numeric", nmax=5000) 或类似的技巧,在我的机器上将~5x10^6 数值从文本文件读取到R 中的速度相对较慢(几秒钟,我读取了几个这样的文件)。为此类任务尝试Rcpp 包装器是否值得(例如Armadillo 有一些实用程序可以读取文本文件)?
或者我可能会因为预期的接口开销而浪费我的时间以获得几乎没有性能提升?我不确定目前是什么限制了速度(机器内在性能,还是其他?)这是一项我每天重复多次的任务,通常,文件格式始终相同,1000 列,大约 5000 行。
如果需要,这里有一个示例文件可供使用。
nr <- 5000
nc <- 1000
m <- matrix(round(rnorm(nr*nc),3),nr=nr)
cat(m[1, -1], "\n", file = "test.txt") # first line is shorter
write.table(m[-1, ], file = "test.txt", append=TRUE,
row.names = FALSE, col.names = FALSE)
更新:我尝试了 read.csv.sql 和 load("test.txt", arma::raw_ascii) 使用犰狳,两者都比 scan 解决方案慢。
【问题讨论】:
-
在 sqldf 中尝试
read.csv.sql看看是否更快。它只是一行代码。 sqldf.googlecode.com -
我试过
system.time(b <- read.csv.sql("test.txt", header = FALSE, sep = " ")),它比system.time(a <- scan("test.txt", what="numeric"))慢。另外,我认为将数据存储到矩阵中应该比data.frame更有效