2009-02-27 31 views
12

私は12 data.frameを使用しています。それらは似ており、私はそれぞれ同じ処理をしなければならないので、data.frameを受け取り、それを処理してdata.frameを返す関数を書いた。これは機能します。しかし、私は非常に大きな構造の周りを回っているのではないかと心配しています。私は一時的なコピーを作っているかもしれません(私ですか?)これは効率的ではありません。 data.frameを回避する最良の方法は何ですか?データフレームを回避する最善の方法は何ですか?

doSomething <- function(df) { 
    // do something with the data frame, df 
    return(df) 
} 
+0

フォローアップの質問: 'doSomething'で終わると、 'rm(doSomething)ガベージコレクションのオブジェクト、そうですか? – bernie

+0

アダム、はい。あなたは正しいです。 –

+0

上記の例では、 'doSomething'はデータではなく関数なので、それほど大きくないことに注意してください。 –

答えて

11

実際には、オブジェクトを周囲に渡してメモリを使用しています。しかし、私はあなたがオブジェクトの周りを通過することなく、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()を強制的に実行する必要がありますか?おそらく、必要に応じて自動的に実行されるわけではないので、メモリ使用量にどのように影響するかを示すために上で実行しただけです。

私はそれが助けてくれることを願っています!

8

私はエキスパートではありませんが、ほとんどの言語は大きなオブジェクトに対して参照カウント方式を使用しています。オブジェクトデータのコピーは、オブジェクトのコピーを変更するまで作成されません。あなたの関数がデータだけを読み込む(すなわち分析する)場合、コピーは行われません。

+3

これはRがうまくいく方法です、Neil。いい視点ね。 –

1

私はこの質問に出会って何か他のものを探していました。それは古くなっていますので、今すぐ簡単な答えを提供します(もっと詳しい説明が必要な場合はコメントを残してください)。

Rの変数を1からすべての変数に渡すことができます。しかしおそらく、あなたはそれについて心配する必要はありません。

[クラスと同様のことを行うこともできます。私は現在のところ、多態関数のクラスの使用方法を理解しており、クラスシステムが2つ以上あることに注意してください。

関連する問題