谢谢大家的提示和答案,我做了一些总结和实验基础上。
请参阅下面的公共数据库(ESS 2008 in Hungary)的一点测试。该数据库有1508个案例和508个变量,所以它可能是一个中等规模的数据。这可能是一个很好的例子(针对我)进行测试,但当然有特殊需求需要进行足够数据的实验。
从SPSS SAV读取数据文件没有任何修饰:
> system.time(data <- read.spss('ESS_HUN_4.sav'))
user system elapsed
2.214 0.030 2.376
加载与转换后的二进制对象:
> write.table(data, file="ESS_HUN_4.csv")
> system.time(data.csv <- read.csv('ESS_HUN_4.csv'))
user system elapsed
1.730 0.010 1.824
:
> save('data',file='ESS_HUN_4.Rdata')
> system.time(data.Rdata <- load('ESS_HUN_4.Rdata'))
user system elapsed
0.28 0.00 0.28
与CSV尝试
T以 “微调” CSV rying加载:
> system.time(data.csv <- read.table('ESS_HUN_4.csv', comment.char="", stringsAsFactors=FALSE, sep=","))
user system elapsed
1.296 0.014 1.362
与包
sqldf,这似乎加载CSV
而且文件速度快了很多:
> library(sqldf)
> f <- file("ESS_HUN_4.csv")
> system.time(bigdf <- sqldf("select * from f", dbname = tempfile(), file.format = list(header = T, row.names = F, sep="\t")))
user system elapsed
0.939 0.106 1.071
而且还加载从数据MySQL数据库在本地主机上运行:
> library(RMySQL)
> con <- dbConnect(MySQL(), user='root', dbname='test', host='localhost', password='')
> dbWriteTable(con, "data", as.data.frame(data), overwrite = TRUE)
> system.time(data <- dbReadTable(con, 'data'))
user system elapsed
0.583 0.026 1.055
> query <-('SELECT * FROM data')
> system.time(data.sql <- dbGetQuery(con, query))
user system elapsed
0.270 0.020 0.473
在这里,我想我们应该添加两个system.time
重移植,因为在我们的案例中连接数据也很重要。请评论,如果我误解了一些东西。
但让我们看看是否只查询一些变量,例如。而绘制我们并不需要所有的数据帧在大多数情况下,查询只有两个变量是不足以创造他们的一个很好的情节:
> query <-('SELECT c1, c19 FROM data')
> system.time(data.sql <- dbGetQuery(con, query))
user system elapsed
0.030 0.000 0.112
这似乎真是太棒了!当然,只是加载表之后dbReadTable
摘要:没有击败来自相同数据库表中读取二进制文件中的全部数据,但阅读只有几列(或其他过滤后的数据)可能是也在一些特殊情况下加权。
测试环境:带有低端SSD的HP 6715b笔记本电脑(AMD X2 2Ghz,4 Gb DDR2)。
UPDATE(24/01/2011):我加负载的比较的hackish,但颇有“创意”的方式只有一个二进制对象的几列 - 这看起来快了很多,然后任何方法研究以上。
注意:代码看起来非常糟糕,但还是很有效的:)
首先,我保存到不同的二进制对象data.frame的所有列通过以下循环:
attach(data)
for (i in 1:length(data)) {
save(list=names(data)[i],file=paste('ESS_HUN_4-', names(data)[i], '.Rdata', sep=''))
}
detach(data)
然后我加载数据的两列:
> system.time(load('ESS_HUN_4-c19.Rdata')) +
> system.time(load('ESS_HUN_4-c1.Rdata')) +
> system.time(data.c1_c19 <- cbind(c1, c19))
user system elapsed
0.003 0.000 0.002
它看起来像一个“超快”的方法! :)注意:它比上面加载的速度快100倍,比最快(加载整个二进制对象)方法的。
我已经编了一个非常小的包(名为:saves),如果感兴趣,请在github查看更多详情。
UPDATE(2008.02.04):我的小封装(saves)的新版本被上传到CRAN,其中可以保存和加载变量甚至更快 - 只要用户只需要数据框或列表中可用变量的一个子集。具体细节看包的来源或my homepage的一个vignette,并且还让我介绍一些基准的一个很好的箱线完成:
这箱线图显示使用的利益节省包加载仅基于load
和read.table
或read.table
或read.csv
的变量的子集,来自外部的read.spss
或来自sqldf
或RMySQL
包的变量的子集。
恭喜你:你有一个闪亮的新SSD的商业案例! – 2011-01-21 12:00:21
@Richie Cotton:你是对的:)但是要告诉你实话:我在附有SSD的机器上运行我的脚本,我想微调代码。 – daroczig 2011-01-21 12:36:51