謝謝大家的提示和答案,我做了一些總結和實驗基礎上。
請參閱下面的公共數據庫(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