0

次のforループがあります

for( i in 1:No_Simulations) {
      Vec =   rowSums(  sweep(Matrix1,MARGIN=2,Matrix2[i,],`*`)  )
      if( i == 1 ) {  Result <- Vec } else {   Result = cbind(  Result , Vec )  } }

No_Simulations = 10000 で、Matrix2 の dim は 10000 100 で、Matrix1 の dim も 10000 100 です。

R コンパイラが次のエラーを表示するため、コードのこの部分を実行できません。

つまり、サイズ 366.6 MB のベクトルを割り当てることができません。また、memory.limit() を使用してメモリ サイズを増やしてみましたが、それでも機能しません。誰かが私を助けてくれませんか。

4

3 に答える 3

6

これは答えになるべきではないと思いますが、あなたの質問にコメントすることはできないようです (私の担当者は低すぎますか?):

メモリ管理に関する明らかな問題をすべて確認したと思います。

  • 割り当てるメモリが物理的に十分にあることを確認します
  • プロセスの合計が PROCESS のアドレス可能な制限を下回っていることを確認してください (実際には 32 ビットでのみ問題になります)。
  • 要求したサイズの連続ブロックを割り当てるのに十分なメモリが空いていることを確認してください。記憶の断片。

そして、数字をいじって、メモリを割り当てることができなくなる限界を判断できますか? 毎回同じですか、それとも他のプロセスを開始/終了すると変化しますか (つまり、異なる量のメモリを使用します)?

編集: R メモリ管理を参照してください/サイズ n Mb のベクトルを割り当てることはできません

于 2012-08-31T16:06:40.720 に答える
2

残念ながら、32ビットオペレーティングシステムには、使用するRAMの量に固有の制限があり、Rはハードドライブにputオブジェクトを使用せず、そこから作業します。RAMをいっぱいにすると(通常、関数'memory.size()'が1.8Gbを返す場合)、Rはそれ以上メモリを割り当てることができないことを示すメッセージを返します。

bigmemoryパッケージが最善の策です。このパッケージを使用すると、Rで非常に大きなオブジェクトを使用できます(スピードヒットあり)。bigmemoryのマニュアルには、あなたに関連する例が たくさんあります。

その上、Rのメモリ管理に役立ついくつかのバニラR関数があります。

  • memory.size():Rの現在の(または最大の)メモリ使用量に関する情報を返します
  • rm():ワークスペースからRオブジェクトを削除します
  • gc():ガベージコレクターを呼び出し、無駄なメモリを再割り当てします。指定されたオプションの引数に応じて、関数はメモリ使用量に関する有用な情報も返します。

私はあなたのデータのサンプルだけを取ると言ってあなたをひいきにしませんが、このアプローチはいくつかの(すべてではない)問題に役立ちます。

お役に立てば幸いです。

編集:Rでオブジェクトのメモリサイズを見つけるための非常に便利な関数: Rセッションで使用可能なメモリを管理するためのトリック

于 2012-08-31T18:09:38.307 に答える
0

おそらく他のプログラムやプロセスが多数実行されているデバイスでこれを行っています。すべてのプログラムと R を閉じます。コンピューターを再起動して R のみを実行し、コードを再度実行します。それはおそらく文句なしに成功するでしょう。

于 2012-08-31T20:34:40.530 に答える