64

64 GB RAMを搭載したWindows 64 ビット コンピューターでシミュレーションを実行します。メモリ使用量が55%に達し、シミュレーションの実行が終了した後、作業領域内のすべてのオブジェクトを で削除し、続いて.rm(list=ls())double gc()

これにより、次のシミュレーション実行に十分なメモリが解放されると思っていましたが、実際にはメモリ使用量がわずか 1% 減少しました。さまざまなフォーラムを調べてみましたが、満足のいく説明を見つけることができず、次のような漠然としたコメントしかありませんでした。

「オペレーティング システムによっては、解放されたメモリがオペレーティング システムに戻されず、プロセス空間に保持される場合があります。」

次の情報を知りたい:

  • 1) どの OS で、どの条件で解放されたメモリが OS に返されないか、および
  • 2) R を閉じて、次のシミュレーション実行のためにもう一度開始する以外に解決策がある場合は?
4

2 に答える 2

41

Rガベージ コレクタは、次の (そうではない) 微妙な点で不完全です: オブジェクトを移動しません(つまり、メモリを圧縮しません) Cこれは、ライブラリと対話する方法が原因です。(他のいくつかの言語/実装もこれに悩まされていますが、の は、 とやり取りする必要があるにもかかわらず、この問題に悩まされていない世代別 GC の圧縮Cを管理しています)。

これは、メモリの小さなチャンクを順番に割り当ててから破棄し、大きなチャンクをより永続的なオブジェクトに割り当てると (これは、文字列/正規表現処理を行う場合によくある状況です)、メモリが断片化され、ガベージ コレクターが何もできないことを意味します。 it: メモリは解放されますが、空きチャンクが短すぎるため再利用できません

この問題を解決する唯一の方法は、必要なオブジェクトを保存し、Rを再起動して、オブジェクトを再ロードすることです。

rm(list=ls())つまり、オブジェクトを必要としないため、何も保存して再ロードする必要はありません。したがって、あなたの場合、解決策はまさに回避したいものです-再起動R.

PS1。ガベージ コレクションは、非常に重要なトピックです。たとえば、Ruby は 20 年間で 5 つ (!) の異なる GC アルゴリズムを使用しましたSun/ OracleIBMは、GC のそれぞれの実装に多くのプログラマー年月を費やしたため、Java GC は悪くありません。一方、R と Python はお粗末な GC を持っています - 誰も必要な工数を投資することを気にしなかったからです - そしてそれらは非常に人気があります。それはあなたにとって悪いことです。

PS2。関連: R: strsplit でメモリ不足

于 2013-04-21T15:03:45.350 に答える
26

メモリ使用量をどのように確認しますか? 通常、仮想マシンは、データを格納するために使用するメモリのチャンクを割り当てます。割り当てられたものの一部は未使用であり、空きとしてマークされている場合があります。GC が行うことは、どこからも参照されていないデータを検出し、対応するメモリのチャンクを未使用としてマークすることです。これは、このメモリが OS に解放されることを意味しません。それでも VM の観点から見ると、さらなる計算に使用できる空きメモリが増えています。

他の人が尋ねたように、メモリ不足エラーが発生しましたか? そうでない場合は、何も心配する必要はありません。

編集: これこれは、R でメモリ割り当てとガベージ コレクションがどのように機能するかを理解するのに十分なはずです。

最初のドキュメントから:

未使用のページを解放してオペレーティング システムに戻そうとする場合があります。ページが解放されると、各クラスに割り当てられたノードの数に R_MaxKeepFrac を掛けた数の空きノードが保持されます。この要件を満たす必要のないページは解放されます。ページの解放は、R_PageReleaseFreq レベル 1 またはレベル 2 コレクションごとに試行されます。

EDIT2:

使用メモリを確認するには、verbose を TRUE に設定して gc() を実行してみてください。

gc(verbose=T)

メモリ内の 10'000'000 整数の配列の結果を次に示します。

Garbage collection 9 = 1+0+8 (level 2) ... 
10.7 Mbytes of cons cells used (49%)
40.6 Mbytes of vectors used (72%)
          used (Mb) gc trigger (Mb) max used (Mb)
Ncells  198838 10.7     407500 21.8   350000 18.7
Vcells 5311050 40.6    7421749 56.7  5311504 40.6

そして、それへの参照を破棄した後は次のとおりです。

Garbage collection 10 = 1+0+9 (level 2) ... 
10.7 Mbytes of cons cells used (49%)
2.4 Mbytes of vectors used (5%)
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 198821 10.7     407500 21.8   350000 18.7
Vcells 310987  2.4    5937399 45.3  5311504 40.6

ご覧のとおり、Vcells が使用するメモリは 40.6Mb から 2.4Mb に減少しました。

于 2013-01-29T10:20:12.470 に答える