2017-08-22 5 views
1

私は効率的にRにデータを読み込むことを考えていて、load('file.Rdata')またはreadRDS('file.rds')が高速であるかどうかをテストするいくつかの方法を試しました。ファイル file.Rdata file.rdsには同じデータが含まれています。最初はsave(d, 'file.Rdata', compress=F)で作成され、2番目にはsaveRDS(d, 'file.rds', compress=F)で作成されます。Rのロード/リードRDSの速度を正しくベンチマークする方法は?

最初に私は関数microbenchmark()を使用し、出力の最大値について驚いていました。

FIRST TEST:

library(microbenchmark) 
microbenchmark(
    n <- readRDS('file.rds'), 
    load('file.Rdata') 
) 


Unit: milliseconds 
expr      min  lq   mean  median  uq   max   neval 
n <- readRDS('file.rds') 106.5956 109.6457 237.3844 117.8956 141.9921 10934.162 100 
load(fl2)     295.0654 301.8162 335.6266 308.3757 319.6965 1915.706  100 

最大値が外れ値であるように見えます。

だから私は試してみました: SECOND TESTを:私の疑いを確認した

sapply(1:10, function(x) system.time(n <- readRDS('file.rds'))[3]) 
elapsed elapsed elapsed elapsed elapsed elapsed elapsed elapsed elapsed elapsed 
10.50 0.11  0.11  0.11  0.10  0.11  0.11  0.11  0.12  0.12 

sapply(1:10, function(x) system.time(load'flie.Rdata'))[3]) 
elapsed elapsed elapsed elapsed elapsed elapsed elapsed elapsed elapsed elapsed 
1.86  0.29  0.31  0.30  0.30  0.31  0.30  0.29  0.31  0.30 

。データを初めて読み込むときは、次の時間よりもはるかに時間がかかります。私はこれにはデータがどのように割り当てられているのか、Rが2回目に読み込まれた場合にはデータを「完全に」読み込む必要がないことが疑わしい。

質問が残っているので、どうすれば現実的なベンチマークテストを行うことができますか?最初のテストから* .rdsファイルを読む方が速いと私は結論づけています。しかし、これは多数のネバールのためにしか成り立たない。 times = 1を設定すると、* .Rdataを読む方が高速になります(2番目のテストでも示されます)。

ご協力ありがとうございます。

種類は、私がここにまとめしよう[email protected]リストからいくつかの回答を得た

答えて

0

について。すべての回答はherehereです。

ガベージコレクションを強制的にウィリアム・ダンラップのアイデアに続いて、私は次のコードになってしまった:mb$time[mb$expr=="d <- readRDS('file.rds')"]mb$time[mb$expr=="load('file.Rdata')"]で回を抽出する際しかし、それはまだずっとだった最初の値であった

library(microbenchmark) 
mb <- microbenchmark(
    gc1 <- gc(), 
    n <- readRDS('file.rds'), 
    rm(n), 
    gc2 <- gc(), 
    load('file.Rdata'), 
    rm(objectRdata), 
    gc3 <- gc(), 
    times=1000, control = list(order="inorder", warmup=4) 
) 

以下のすべてよりも大きい。奇妙なことに、最初にreadRDSでデータを読み取るのは、最初の時間が最長(約10秒)であるのに対し、初めてloadの場合は2秒かかりました。 readRDSを用いた以下の読み取りは約0.14秒であったが、loadの読み取りは0.32秒であった。

これまでファイルはサーバーに保存されていました。私はC:でローカルに保存されたファイルを使って同じことを試みました。すべての読み取りが締結すると共にload

0.33秒対readRDS 0.14秒より小さい値と近かったローカルファイルをロード/読み出し

。読み込み/読み込みはファイルの場所によって異なり、loadよりも速いです(非圧縮ファイルの)。しかし、R-help @ r-projectで与えられたIsmail Sezenの答えを覚えておいてください。ORG:

なぜreadRDS負荷と呼ばれる2つの機能があるのですか?

それぞれの目的が異なるためです。あなたは バルクが保存機能により、変数を保存し、あなたがsaveRDS機能によって保存された単一の変数をロード/ 読み取りにreadRDS機能を使用する/負荷を読み取るために_loadの_functionを使用しています。したがって、避けられないのは避けられないことです。 両方の機能が異なる目的で最適化されています。これは、 のようなものです。りんごと梨を比較すると、どちらも果物です。時にはリンゴを食べたい場合もあります。 しかし時には梨。

結果として、1つのRオブジェクトを保存して読み込む必要がある場合は、 のreadRDS/saveRDSが好きです。複数のオブジェクトをファイルにシリアル化する必要がある場合は、ロード/保存の組み合わせを とします。

関連する問題