2017-10-23 7 views
0

私は2000列とobject.size(my.data)を持つmy.dataという名前のdata.frameを持っています。Rプログラミングでdata.frameの列を削除した後、object.size()が削除され、なぜrsessionは同じメモリを消費しますか?

は約450 MBを返します。

私は(300列の周り)だけのものを維持することにより、不要な列を削除し、私はその後、私は再びobject.size(my.data)をチェックし、それはまだ450メガバイトだ

my.data <- my.data[,vars.keep] 
gc() 

を必要としています。どのように効率的にメモリを取り戻すことができますか?


さらに詳しい情報を追加したいだけですが、Mauritsは正しいです。不要な列を削除した後、オブジェクトサイズは大幅に減少しましたが、引き続き同じメモリが使用されます。なぜrsessionはメモリを解放しないのですか?

format(object.size(transformed_data), units = "Mb"); 
[1] "40.5 Mb" 
transformed_data <- transformed_data[,vars.keep] 
format(object.size(transformed_data), units = "Mb"); 
[1] "5.3 Mb" 

答えて

2

これは正しいとは言えません。コードを再確認して、新しいRインスタンス内でコードを再実行できますか?

これは私がgcを実行するようdataframe

df <- as.data.frame(matrix(1e6, ncol = 2000, nrow = 1000)); 
format(object.size(df), units = "Mb"); 
# [1] "15.5 Mb" 

# Select only the first 100 columns 
df <- df[, 1:100]; 
format(object.size(df), units = "Mb"); 
# [1] "0.8 Mb" 

サンプルのために得るものです:[...] this postによると、「ガベージコレクタを実行していることは良いことができます(と非常に少なくとも、することができますたとえそれがとにかく(たとえすぐにはすぐに起こらなくても)すぐに誘発される可能性はあるものの、傷つけることはない」一方、Hadley Wickhamは、「あなたはgcを呼び出す必要はないはずです。そうすれば、大きな違いは生じないでしょう」とコメントしています。

+0

ありがとう、モーリッツ、私にチェックしてみましょう –

+0

こんにちはモーリッツ、そうです。列を除去した後、オブジェクトのサイズは劇的に減少しました。しかし、Windowsリソースマネージャでは、rsession.exeのメモリ使用量は変更されません。それは番号を保持します。だから私はいくつかのメモリをリリースしたいので、これはまだ役に立たない。これは、rsessionがメモリを解放したままにして、後で他のオブジェクトが作成されたときに使用するためですか? –

+0

これはおそらく無関係の問題だと思います。 R自体のメモリ管理はOSに依存します。私はWindowsユーザーではありませんが、Linuxではいくつかのライブラリはメモリをチャンクに割り当て、チャンク全体が空き状態になったらメモリを解放することができます。可能であれば、お使いのOSはメモリを解放します。 Rオブジェクトのサイズ変更前後で 'shell( 'systeminfo | findstr Memory')'を使って、メモリ使用量を監視する価値があります。また、Rが2011年からのリリースのメモリをどのように解放するかについての詳細な議論については、こちら[https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14611]をご覧ください。 –

関連する問題