32

私はいくつかの関連する質問をチェックしました

Rにデータをすばやくロードする方法は?

最も評価の高い回答の特定の部分を引用しています

それは、何をしたいか、およびデータをさらに処理する方法によって異なります。いずれにせよ、常に同じデータセットが必要な場合、バイナリ R オブジェクトからの読み込みは常に高速になります。ここでの制限速度は、ハードドライブの速度であり、 R ではありません。バイナリ形式はワークスペース内のデータフレームの内部表現であるため、変換はもう必要ありません

本当にそう思いました。しかし、人生は実験です。igraph オブジェクトを含む 1.22 GB のファイルがあります。そうは言っても、ここで見つけたものはオブジェクトクラスに関連しているとは思いません。これは主に、「ライブラリ」を呼び出す前でも load('file.RData') できるためです。

このサーバーのディスクは非常に優れています。読書時間をメモリにチェックできるように

user@machine data$ pv mygraph.RData > /dev/null
1.22GB 0:00:03 [ 384MB/s] [==================================>] 100% `

ただし、Rからこのデータをロードすると

>system.time(load('mygraph.RData'))
   user  system   elapsed 
178.533  16.490   202.662

したがって、*.RData ファイルのロードはディスク制限より 60 倍遅いようです。これは、R が「ロード」中に実際に何かを行うことを意味するはずです。

異なるハードウェアで異なる R バージョンを使用しても同じ感覚が得られました。今回はベンチマークを行うのに忍耐が必要でした (主な理由は、このようにクールなディスク ストレージでは、ロードに実際にどれくらいの時間がかかるかということでした)。

これを克服する方法についてのアイデアはありますか?


答えのアイデアの後

save(g,file="test.RData",compress=F)

以前は 1.22GB だったファイルが 3.1GB になりました。私の場合、圧縮解除の読み込みは少し高速です (ディスクは私のボトルネックではありません)。

> system.time(load('test.RData'))
user  system elapsed 
126.254   2.701 128.974 

圧縮されていないファイルをメモリに読み込むのに 12 秒ほどかかるため、ほとんどの時間が環境の設定に費やされていることがわかります

RDS の結果が返ってきます。興味深いですね


約束通り、ここにいます

system.time(saveRDS(g,file="test2.RData",compress=F))
user  system elapsed 
7.714   2.820  18.112 

そして、おそらくsaveオブジェクト名も保存するため、md5sumは異なりますが、非圧縮の「保存」と同じように3.1GBを取得します

今読んでいる...

> system.time(a<-readRDS('test2.RData'))
user  system elapsed 
41.902   2.166  44.077 

したがって、両方のアイデア (圧縮解除と RDS) を組み合わせると、5 倍速く実行されます。貢献していただきありがとうございます。

4

3 に答える 3

12

saveはデフォルトで圧縮されるため、ファイルの解凍には余分な時間がかかります。次に、大きなファイルをメモリにロードするのに少し時間がかかります。あなたのpv例は、圧縮されたデータをメモリにコピーするだけですが、これはあまり役に立ちません。;-)

アップデート:

私は自分の理論をテストしましたが、それは正しくありませんでした (少なくとも 3.3Ghz CPU と 7200RPM HDD を搭載した Windows XP マシンでは)。圧縮ファイルの読み込みは高速です (おそらく、ディスク I/O が減少するため)。

余分な時間はRestoreToEnv(でsaveload.c) および/またはR_Unserialize(でserialize.c) に費やされます。したがって、これらのファイルを変更するか、 を使用saveRDSしてオブジェクトを個別に保存し、複数の R プロセスを使用して共有メモリにデータをロードするmyGraph.RDataことで、ロードを高速化できます...loadRDS

于 2012-07-19T11:40:02.153 に答える
5

大きな変数の場合、ほとんどの時間が内部 C コード ( http://svn.r-project.org/R/trunk/src/main/saveload.c ) 内で占められているのではないかと思います。プロファイリングを実行して、私が正しいかどうかを確認できます。(関数内の R コードはすべて、loadファイルが空ではなく、破損していないことを確認するだけです。

変数をメモリに読み込むだけでなく、(とりわけ) R 環境内に格納する必要があります。

変数のロードを大幅に高速化する唯一の明らかな方法は、コードを並列に書き直して、変数の同時ロードを許可することです。これには、おそらく R の内部構造を大幅に書き直す必要があるため、そのような機能について息を止めてはいけません。

于 2012-07-19T11:42:51.840 に答える