大きなオブジェクトを作成してRAMが不足した後、現在の環境で次を使用してオブジェクトを削除してみます
rm(list=ls())
RAMの使用量を確認しても、何も変わっていません。電話をかけgc()
ても何も変わっていません。RAMを補充するには、Rを終了する必要があります。
R内でメモリを大量に消費するオブジェクトを処理するためのアドバイスはありますか?
大きなオブジェクトを作成してRAMが不足した後、現在の環境で次を使用してオブジェクトを削除してみます
rm(list=ls())
RAMの使用量を確認しても、何も変わっていません。電話をかけgc()
ても何も変わっていません。RAMを補充するには、Rを終了する必要があります。
R内でメモリを大量に消費するオブジェクトを処理するためのアドバイスはありますか?
削除されたオブジェクトのメモリはすぐには解放されません。Rは、「ガベージコレクション」と呼ばれる手法を使用して、削除されたオブジェクトのメモリを再利用します。定期的に、アクセス可能なオブジェクト(基本的に、名前があり、削除されていないため、ユーザーがアクセスできるオブジェクト)のリストを循環し、保持のためにそれらに「タグ付け」します。タグなしオブジェクトのメモリは、ガベージコレクションスイープ後にオペレーティングシステムに返されます。
ガベージコレクションは自動的に行われ、このプロセスを直接制御することはできません。ただし、コマンドラインからコマンドgc()を呼び出すことにより、強制的にスイープすることができます。
それでも、一部のオペレーティングシステムでは、ガベージコレクションがメモリを再利用しない場合があります(OSの報告による)。たとえば、古いバージョンのWindowsは、Rのメモリフットプリントを増やすことはできますが、減らすことはできません。ガベージコレクションは、将来、新しいオブジェクト用のスペースを作成するだけで、Rのメモリ使用量を減らすことはできません。
Windowsでは、あなたが説明するテクニックが私に役立ちます。次の例を試してください。
Windowsタスクマネージャーを開きます(CTRL + SHIFT + ESC)。
RGuiを起動します。RGui.exememの使用量は27460Kです。
タイプ
gcinfo(TRUE)
x <- rnorm(1e8)
RGui.exememの使用量は811100Kになりました。
タイプrm("x")
。RGui.exememの使用量はまだ811100Kです。
タイプgc()
。RGui.exememの使用量は28332Kになりました。
ワークスペースからオブジェクトを削除した後、新しい変数により多くのメモリを割り当てようとすると、gcが自動的に呼び出されることに注意してください。
私の印象では、Rがメモリ割り当ての失敗を報告する前に、の複数の形式gc()
が試されます。あなたが提案するようにRを再起動する以外に、私は現在これに対する解決策を知りません。Rはメモリを最適化していないようです。
古い質問ですが、(OS Mojaveで)Rセッションでprir :: mem_used()を呼び出すと、アクティビティモニターが報告されたメモリ使用量をすぐに更新して、Rに保持されているオブジェクトのみを反映することがわかりました。環境。