6

R を使用してデータ分析を行っています。システム仕様: i5 + 4GB RAM。何らかの理由で、R セッションがデータよりもはるかに大きな RAM のチャンクを占有しているため、他の操作のためのスペースがほとんどありません。

550MB の csvファイルを読み取り、R が使用するメモリ: 1.3 - 1.5GB csv を .RData ファイルとして保存しました。ファイルサイズ: 183MB . ファイルを R にロードし、R が使用するメモリ: 780MB。なぜこれが起こっているのか、それを修正する方法はありますか?

編集: ファイルには 123 列と 1190387 行があります。変数の型はnumandintです。

4

4 に答える 4

18

数値(倍精度浮動小数点)は8バイトのRAMに格納されます。
整数値(この場合)は4バイトを使用します。
データには1,190,387*123=146,417,601の値があります。
すべての列が数値である場合、1,171,340,808バイトのRAMが使用されます(〜1.09GB)。
すべてが整数の場合、585,670,404バイトが必要です(〜558MB)。

したがって、データが780MBのRAMを使用することは完全に理にかなっています。

非常に一般的なアドバイス:

  1. data.frameをマトリックスに変換します。多くの場合、マトリックス操作のオーバーヘッドは少なくなります。
  2. Rパッケージbigmemoryを試してください:http://cran.r-project.org/web/packages/bigmemory/index.html
  3. より多くのRAMを購入します。おそらくあなたのマシンは最大16GBをサポートできます。
  4. すべてのデータを同時にRAMにロードしないでください。行または列のサブセットをロードし、分析し、結果を保存し、繰り返します。
  5. 非常に小さなテストデータセットを使用して分析を設計してから、より多くのメモリを備えた別のマシン/サーバーで完全なデータセットを分析します。
于 2012-07-31T01:44:12.440 に答える
6

Rは、おそらくオブジェクトのコピーが原因で、より多くのメモリを使用します。これらの一時的なコピーは削除されますが、Rは引き続きスペースを占有します。このメモリをOSに戻すには、gc関数を呼び出すことができます。ただし、メモリが必要な場合は、gcが自動的に呼び出されます。

さらに、550 mbcsvファイルがRで550mbにマップされることは明らかではありません。これは、すべて異なる量のメモリを使用する列のデータ型(float、int、character)によって異なります。

Rがデータを圧縮するので、Rdataファイルが小さいという事実は奇妙ではありません。のドキュメントを参照してくださいsave

于 2012-07-30T04:52:47.380 に答える
1

read.table()に基づくread.csv()を使用していると思います。

これらの関数の問題は、メモリをひどく断片化することです。また、R ガベージ コレクターは、割り当てられた領域を移動して断片化された部分からメモリを解放することができないため (R ガベージ コレクターの欠点)、選択したソリューションに行き詰まります。

  • read.table を介してデータを読み取ります。
  • save()で保存します。
  • Rを倒す
  • load()を介してデータをロードします。
于 2016-08-17T12:05:42.703 に答える