6

32 GB のサーバーに 4 GB のデータセットがあるとします。

そのすべてを R に読み込み、data.table グローバル変数を作成し、すべての関数でそのグローバルを一種のメモリ内データベースとして使用することができます。ただし、R を終了して再起動すると、ディスクから再度読み取る必要があります。スマート ディスク キャッシュ戦略 (保存/読み込みまたは R.cache) を使用しても、そのデータを取得するのに 10 秒程度の遅延があります。そのデータのコピーには約 4 秒かかります。

Rセッションの終了後も存続するメモリにこれをキャッシュする良い方法はありますか?

RServe、redis/Rredis、Memcache、マルチコア... Shiny-Server と Rstudio-Server にも、この問題を解決する方法があるようです。

しかし、繰り返しになりますが、データを R のメモリ ブロックの外に移動するように見えるので、おそらく data.table がこの機能を提供できるように思えます。これは、データのコピーや再構築などを必要としないという点で理想的です。

アップデート:

より詳細なテストをいくつか実行しましたが、以下のコメントに同意しますが、おそらく文句を言う必要はあまりありません。

しかし、他の人が役に立つかもしれないいくつかの数字をここに示します。私は32GBのサーバーを持っています。4GB サイズの data.table を作成しました。gc() によると、また top を見ると、約 15GB のピーク メモリを使用しているように見え、これにはデータの 1 つのコピーの作成が含まれます。それはかなり良いと思います。

save() でディスクに書き込み、オブジェクトを削除し、load() を使用して再作成しました。これには、それぞれ 17 秒と 10 秒かかりました。

私は R.cache パッケージで同じことをしましたが、これは実際には遅かったです。23秒と14秒。

ただし、これらのリロード時間はどちらも非常に高速です。load() メソッドにより、357 MB/秒の転送速度が得られました。比較すると、コピーには 4.6 秒かかりました。これは仮想サーバーです。ストレージの種類や、読み取り速度がキャッシュによってどの程度影響を受けるかはわかりません。

4

3 に答える 3

5

非常に真実:data.tableまだディスク上のテーブルを取得していません。それまでの間、いくつかのオプションがあります:

  • R を終了しないでください。ホームページevalServer()のビデオが示すように、サーバー上で実行したままにして、 svSocket を使用してください。data.tableまたは、あなたが言及した他の同様のオプション。

  • SQL やその他の noSQL データベースなど、永続性のためにデータベースを使用します。

  • 大きな区切りファイルがある場合fread()load(). しかし、試してみてcompress=FALSEください。また、fwrite最新の開発バージョン (1.9.7、devtools::install_github("Rdatatable/data.table")インストールに使用) にプッシュしたところです。これには、ネイティブと同等の書き込み時間が報告されsaveています。

  • パッケージffbigmemoryおよびsqldfも。HPC タスク ビューの「大容量メモリとメモリ不足データ」セクションを参照してください。

が使用されている企業でdata.tableは、現在、主に他の永続的なデータベースからのデータが供給されていると思います。それらの企業はおそらく:

  • たとえば、16GB、64GB、または128GBのRAMで64ビットを使用します。最近のRAMは安いです。(しかし、これは永続性に対処していないことに気づきました。)

内部は、ディスク上のテーブルを念頭に置いて書かれています。しかし、息を止めないでください!

于 2013-03-27T22:52:40.283 に答える
3

計算セッションの間に何らかの奇妙な理由で R を終了する必要があり、サーバーが再起動されない場合は、RAM に 4 GB の RAM ディスクを作成し、そこにデータを保存します。RAMからRAMへのデータのロードは、SASまたはSSDドライブと比較してはるかに高速です:)

これは、次の行を に追加するなどの方法で、Linux で非常に簡単に解決できます/etc/fstab

none  /data  tmpfs  nodev,nosuid,noatime,size=5000M,mode=1777  0  0
于 2013-03-27T23:40:15.387 に答える
3

データセットがどのように見えるかに応じて、パッケージ ff の使用を検討できます。データセットを ffdf として保存すると、ディスクに保存されますが、R からのデータに引き続きアクセスできます。ff オブジェクトには、仮想部分と物理部分があります。物理部分はディスク上のデータであり、仮想部分はデータに関する情報を提供します。

このデータセットを R にロードするには、データセットの仮想部分のみをロードします。これは、因子を含むデータが大量にあるかどうかに応じて、はるかに小さく、おそらく数 Kb しかありません。したがって、これにより、物理データにアクセスして処理を実行しながら、数秒ではなく数ミリ秒で R にデータをロードできます。

于 2013-03-28T08:58:49.670 に答える