web-dev-qa-db-ja.com

gc()とrm()の違いは何ですか

rm(list=ls())の呼び出しを使用して、Rのメモリを定期的にクリーニングしています。
その後、ガベージコレクタgc()を呼び出す必要がありますか?

これら2つの機能の違いは何ですか? gc()は特定の変数に対してrm()を呼び出しますか?

56
RockScience

まず、gcはまだ使用している変数anyを削除しないという点で、2つは非常に異なることに注意することが重要です。アクセスできなくなったメモリのみを解放します(rm()を使用して削除するか、または、その後返された関数で作成したかどうか)。 gc()を実行しても、変数が失われることはありません。

ただし、gc()を呼び出した後にrm()を呼び出す必要があるかどうかは、良い質問です。 gcの documentation を参考にしてください。

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

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

したがって、答えは、たとえとにかくトリガーされる可能性が高いとしても(すぐにではなく、すぐに)gc()を呼び出すのは良いことです(少なくとも、害はありません)。

74
David Robinson

個人的には、ループにgc()を含めて、RAMループが使用可能なスペースを使い始めたときに解放します。

for(i in 1:1000){
res[[i]] = some operation
gc()
}
0
Gabriel123

Gcペナルティに関するThankGoatのコメントについては、これは事実ですが、ループ内でN回の繰り返しごとにgcを呼び出すこともできます(Nはさまざまな方法でパラメーター化できます)。反復回数は多いが、特定の反復内のリソース使用量が控えめなループの場合、望ましいパフォーマンスを回復するために、反復ごとにGCを実行する必要はないかもしれません。

もちろん、非常に多くの非常に使用頻度の高い繰り返しでループしている場合、それは別の話ですが、その段階では、コードを単純にベクトル化したり、別の言語で記述する必要がある場合があります。

0
Pascoe