実際には、オブジェクトを周囲に渡してメモリを使用しています。しかし、私はあなたがオブジェクトの周りを通過することなく、R内のオブジェクトに対して操作を行うことはできないと思います。関数を作成せずに関数の外で操作したとしても、Rは基本的に同じ動作をします。
これを確認する最も良い方法は、例を設定することです。 Windowsの場合は、Windowsタスクマネージャを開きます。 Linuxの場合は、ターミナルウィンドウを開き、topコマンドを実行します。この例ではWindowsと仮定します。 Rでは、以下を実行します。
col1<-rnorm(1000000,0,1)
col2<-rnorm(1000000,1,2)
myframe<-data.frame(col1,col2)
rm(col1)
rm(col2)
gc()
これは、col1とcol2という2つのベクトルを作成し、それらをmyframeというデータフレームに結合します。次に、ベクトルを削除し、ガベージコレクションを強制的に実行します。 Windowsのタスクマネージャで、Rgui.exeタスクのmemの使い方を見てください。私がRを始めると、約19メガバイトのmemが使われます。私は私のマシンは
R.
のためだけの下で35メガを使用している上記のコマンドを実行した後、今これを試してください:R用
myframe<-myframe+1
あなたのメモリ使用量が144以上のMEGにジャンプする必要があります。 gc()を使用して強制的にガベージコレクションを行うと、それは約35メガバイトに戻ります。関数を使用して、これを試すには、次の操作を行うことができます:あなたは上記のコードを実行すると、メモリ使用量が160メガほどまでジャンプします
doSomething <- function(df) {
df<-df+1-1
return(df)
}
myframe<-doSomething(myframe)
。 gc()を実行すると、それを35メガバイトに戻します。
だから、これをどうすればいいですか?さて、関数の外で操作を行うことは、関数で行うよりもはるかに効率的ではありません(メモリの面で)。ガーベジコレクションは事をきれいに整えます。 gc()を強制的に実行する必要がありますか?おそらく、必要に応じて自動的に実行されるわけではないので、メモリ使用量にどのように影響するかを示すために上で実行しただけです。
私はそれが助けてくれることを願っています!
フォローアップの質問: 'doSomething'で終わると、 'rm(doSomething)ガベージコレクションのオブジェクト、そうですか? – bernie
アダム、はい。あなたは正しいです。 –
上記の例では、 'doSomething'はデータではなく関数なので、それほど大きくないことに注意してください。 –