質問
私はで動作するように12 data.frame
sを持っています。彼らは似ていると私はそれぞれに同じ処理をしなければならないので、私はdata.frame
を取る関数を書いて、それを処理した後、data.frame
を返します。これは動作します。しかし、私は非常に大きな構造物の周りに渡すことだと怖いです。私は一時的なコピーを作成することができる(I午前?)これは、効率的にすることはできません。 data.frame
を周りに渡す回避する最善の方法は何ですか?
doSomething <- function(df) {
// do something with the data frame, df
return(df)
}
解決
あなたの周りのオブジェクトを渡すと、いくつかのメモリを使用して、実際に、あります。しかし、私はあなたの周りのオブジェクトを渡すことなく、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にと呼ばれるベクトルのカップルは、その後MyFrameと呼ばれるデータフレームにそれらを組み合わせて作成されます。その後、実行するベクトルと力ガベージコレクションを削除します。 Rgui.exeタスクのメモリ使用量でお使いのWindowsのタスクマネージャで見てください。私はRを起動すると、それはMEMの約19メガを使用しています。私は私のマシンは、Rのすぐ下に35メガを使用している上記のコマンドを実行した後、
さて、これを試してみます:
myframe<-myframe+1
Rのためのあなたのメモリ使用量は、144以上のMEGにジャンプする必要があります。あなたは)(GCを使用して、ガベージコレクションを強制する場合は、それが約35メガに戻ってドロップが表示されます。関数を使用して、これを試すために、あなたは次の操作を行うことができます:
doSomething <- function(df) {
df<-df+1-1
return(df)
}
myframe<-doSomething(myframe)
あなたは上記のコードを実行すると、メモリ使用量が160メガほどまでジャンプします。 GC()を実行すると、35メガに戻ってそれをドロップします。
だから、このすべての何を作るには?さて、関数の外で操作を行うと、そのはるかに効率的(メモリの面で)機能でそれを行うよりもではありません。ガベージコレクションは、本物の素敵なものをクリーンアップします。あなたが実行するために)(GCを強制すべきか?おそらくない、必要に応じて、それが自動的に実行されるように、私はどのように影響を与えるのメモリ使用量を表示するために、上記のことを実行しました。
私はそれが役に立てば幸い!
他のヒント
私はRの専門家だが、ほとんどの言語は、大きなオブジェクトの参照カウント方式を採用しています。あなたは、オブジェクトのコピーを修正するまで、オブジェクトデータのコピーが行われることはありません。あなたの機能のみ(すなわち、分析用)のデータを読み込む場合は、何のコピーが行われるべきではない。
私は何か他のものを探して、この質問に出くわした、そしてそれは古いです - ので、私はちょうど(あなたがもっと説明が欲しい場合はコメントを残して)今の簡潔な答えを提供します。
。あなたは、変数のすべてにどこでも1から含まれているRで環境を周りに渡すことができます。しかし、おそらくあなたはそれを心配する必要はありません。
[また、クラスと似た何かをすることができるかもしれません。私は現在、多型の機能のためのクラスを使用する方法を理解 - と周り蹴る以上1クラスのシステムがあります注意してください]
。