は、私はそれに基づいて、いくつかの概要と実験を行った、ヒントと回答ありがとうございました。
以下の公開データベース(ESS 2008 in Hungary)を使用して、少しテストを参照してください。データベースには1508のケースと508の変数があるため、中規模のデータになる可能性があります。それは(私のために)テストを行う良い例かもしれませんが、もちろん特別なニーズは適切なデータを使った実験を必要とします。変換されたバイナリオブジェクトと
> 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と試みるそのままSPSS SAVファイルからデータを読み取る
T
> 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
もからデータをロード:CSVが速くたくさんのファイルをロードするように思わパッケージsqldf、と
また
> system.time(data.csv <- read.table('ESS_HUN_4.csv', comment.char="", stringsAsFactors=FALSE, sep=","))
user system elapsed
1.296 0.014 1.362
: "微調整" CSVロードでryingローカルホスト上で実行されている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
ここで私は2つ追加する必要がありますsystem.time
私たちのケースでは、データへの接続も重要です。私が何かを誤解した場合は、コメントしてください。
しかし、たとえばいくつかの変数だけを照会する場合は、本当に素晴らしいと思われる
> query <-('SELECT c1, c19 FROM data')
> system.time(data.sql <- dbGetQuery(con, query))
user system elapsed
0.030 0.000 0.112
:私たちは、ほとんどの場合、すべてのデータフレームを必要としないプロット、および2つの変数のみを照会しながら、それらの素敵なプロットを作成するのに十分です!もちろん、ただdbReadTable
まとめて表をロードした後:バイナリファイルからの全データを読み込むビートに何が、同じデータベーステーブルからわずか数の列(またはその他のフィルタリングされたデータ)を読み込むこともあるかもしれません特別な場合には重み付けされる。
テスト環境:ローエンドSSD搭載のHP 6715bラップトップ(AMD X2 2Ghz、4Gb DDR2)。
UPDATE(24/01/2011):私はむしろハックを追加しましたが、バイナリオブジェクトの数だけ列ロードのかなりの「創造的」な方法 - 検討どんな方法その後、はるかに高速になります上記。
は注意してください:コードは本当に悪いように見えますが、まだ非常に効果的でしょう:)
はまず、私は、次のループを介して異なるバイナリオブジェクトに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)
そして私は、データの2つの列を読み込む:
「超高速」方式のように見える
> 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(2011年6月3日):私の小さなパッケージ(saves)の新しいバージョンは、さらに高速の変数を保存してロードすることも可能である、CRANにアップロードされた - 唯一のユーザーならばデータフレームまたはリスト内の使用可能な変数のサブセットのみが必要です。詳細については、パッケージのソースまたはmy homepage上の1でvignetteを参照してください、と私も行われ、いくつかのベンチマークの素敵な箱ひげをご紹介しましょう:
この箱ひげ図はを使用する利点は、ロードするためにパッケージを節約示し基底からのload
およびread.table
またはread.csv
に対する変数のサブセット、sqldf
またはRMySQL
パッケージからのread.spss
の変数のサブセットのみです。
おめでとうございます:光っている新しいSSDのビジネスケースがあります。 –
@リッチー・コットン:そうです:)しかし、真実を伝えるために、私はSSDを取り付けたマシンでスクリプトを実行しますが、コードを微調整したいと思います。 – daroczig