web-dev-qa-db-ja.com

gc()コマンドでガベージコレクションをRで実行する

定期的に私はだらしなくプログラムします。わかりました、私はいつもだらしないようにプログラムしますが、時々それはメモリ不足エラーの形で私に追いつく。 rm()コマンドを使用してオブジェクトを削除する際に少し規律を行使し始めると、事態は改善します。大きなデータオブジェクトを削除した後、gc()を明示的に呼び出す必要があるかどうかについて、オンラインで混合メッセージが表示されます。 Rがメモリエラーを返す前にgc()を実行すると言う人もいれば、手動でgcを強制することは良い考えだと言う人もいます。

最大のメモリ可用性を確保するために、大きなオブジェクトを削除した後にgc()を実行する必要がありますか?

64
JD Long

"多分。"私もそれをします。そしてしばしば

cleanMem <- function(n=10) { for (i in 1:n) gc() }

しかし、私の経験では、それは記憶を元の状態に復元しません。

したがって、私が通常行うことは、タスクをスクリプトファイルに保持し、「r」フロントエンドを使用して実行することです(Unixでは、「littler」パッケージから)。 Rscriptは、他のOSの代替手段です。

そのワークフローはたまたま同意します

前にここで説明しました。

46

gc のヘルプページから:

「gc」を呼び出すと、ガベージコレクションが行われます。これは、ユーザーの介入なしに自動的に行われます。「gc」を呼び出す主な目的は、メモリ使用量のレポートです。

ただし、ラージオブジェクトが削除された後に「gc」を呼び出すと、Rがオペレーティングシステムにメモリを返すように促す場合があるので便利です。

そのため、canは便利ですが、ほとんどの場合は不要です。私の個人的な意見は、それは最後の手段のコードであるということです-もちろんgc()ステートメントでコードを散らかすべきではありませんが、マシンが転倒し続け、他のすべてを試した場合、それは役に立つかもしれません。

他のすべてによって、私はのようなものを意味します

  1. 生のスクリプトではなく関数を記述するため、変数はスコープ外になります。

  2. ある問題から別の無関係な問題に移った場合にワークスペースを空にします。

  3. 興味のないデータ/変数を破棄します。(私は頻繁に数十の興味のない列を持つスプレッドシートを受け取ります。)

23
Richie Cotton

パーティーに少し遅れましたが、:

gcを明示的に呼び出すと、「今」メモリがいくらか解放されます。 ...そのため、他のプロセスがメモリを必要とする場合、それは良い考えかもしれません。たとえば、systemなどを呼び出す前に。または、スクリプトで「完了」し、Rが次のジョブが到着するまでしばらくアイドル状態になる場合-再び、そのため他のプロセスより多くのメモリを取得します。

スクリプトをより高速に実行したいだけの場合、Rは必要に応じて後で呼び出すため、問題にはなりません。通常のGCサイクルでは呼び出す必要がないため、さらに遅くなる場合があります。

...しかし、たとえば時間を測定したい場合、通常はテストを実行する前にGCを行うことをお勧めします。これは何 system.timeはデフォルトで実行します。

[〜#〜] update [〜#〜] @DWinが指摘するように、R(またはC#、またはJavaなど)は、メモリがいつあるかを常に把握しているわけではありませんメモリシステムの不足を回避するためにGCを実行する必要がある場合があります。

14
Tommy

おそらくRはRAMのみを使用します。これはMacでは当てはまりません(Windowsでも当てはまらないと思います)。RAMが不足すると、仮想メモリの使用が開始されます。常にではありませんが、プロセスはgc()を実行してメモリを解放する必要があることを「認識」する場合があります。そうしない場合は、ActivityMonitor.appを使用して、すべてのRAMが占有されており、ディスクアクセスが跳ね上がっていることを確認できます。 gc(); cph(...)を使用した呼び出しに先行することで、仮想メモリに(ディスクアクセスが遅い)スピルオーバーを回避できる回帰が実行されます。

14
42-

いいえ。操作に使用可能なメモリが十分にない場合、Rはgc()を自動的に実行します。

9
hadley

"多分。"決定的な答えはありません。しかし、ヘルプファイルでは、gc()を呼び出す理由は実際には2つしかないことが示唆されています。

  1. メモリ使用量のレポートが必要です。
  2. ラージオブジェクトを削除した後、「メモリをオペレーティングシステムに戻すようRに要求する場合があります。」

呼び出しが繰り返されると大規模なシミュレーションの速度が低下する可能性があるため、大規模なものを削除した後にのみ実行する傾向があります。つまり、正当な理由がない限り、常に体系的に呼び出すことは理にかなっていないと思います。

7
Shane