2012-01-11 20 views
39

私は定期的にrm(list=ls())への呼び出しを使用してRのメモリを掃除していますとの違いは何ですか。
は、私はその後、ガベージコレクタgc()を呼び出す必要がありますか?GC()およびRM()

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

答えて

57

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

に電話する必要があるかどうかの質問は、rm()を呼び出した後には良いものです。 documentation gcの参考情報:

ガベージコレクションが発生する原因となります。これはユーザーの介入なしに自動的に行われ、gcを呼び出す主な目的はメモリー使用量に関する報告です。

しかし、大きな物体が除去された後、これはオペレーティングシステムにメモリを返すようにRを促すことができるように、GCを呼び出すために有用であり得ます。

だから、答えは、それはおそらく(すぐに、その後、すぐにそうでない場合は)とにかくトリガーされるにもかかわらず、gc()を呼び出すために(そして非常に少なくとも、傷つけることはできません)良いことができますということです。

+0

のような何かがあなたの答えをいただき、ありがとうございます。一般に、Rの自動ガベージコレクションは良いと考えられていますか? (例えばJavaのものと同じくらい頑丈なもの) – RockScience

+0

これは難しい質問ですが、わかりません。 [この質問](http://stackoverflow.com/questions/1467201/forcing-garbage-collection-to-run-in-r-with-the-gc-command)は便利です。 –

+5

一般的に、gcを呼び出す必要はありません。そうした場合、大きな違いはありません。 – hadley

-1

個人的に私はループが利用可能なスペースを埋める起動したときに、いくつかのRAMを解放するために、ループでgc()を含めるのが好き。

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

gc()の呼び出しには、1回の呼び出しにつき100ms程度の非常に大きなパフォーマンスペナルティがあることに注意してください。したがって、この場合、コードは必要以上に約100秒長く実行されます。 – ThankGoat

関連する問題