12

作業するのは12data.frame秒です。それらは類似しており、それぞれに対して同じ処理を行う必要があるため、を取り、data.frameそれを処理してから、を返す関数を作成しましたdata.frame。これは機能します。しかし、私は非常に大きな構造物を通り過ぎているのではないかと心配しています。一時的なコピーを作成している可能性があります(私ですか?)これは効率的ではありません。data.frame周りを通り過ぎるのを避けるための最良の方法は何ですか?

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

3 に答える 3

10

実際、オブジェクトを渡し、メモリを使用しています。しかし、オブジェクトを渡さずに 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 タスクのメモリ使用状況を確認します。Rを起動すると、約19メガのメモリが使用されます。上記のコマンドを実行した後、私のマシンは R に 35 メガ未満しか使用していません。

これを試してください:

myframe<-myframe+1

R のメモリ使用量は 144 MB を超えるはずです。gc() を使用してガベージ コレクションを強制すると、約 35 MB に戻ることがわかります。関数を使用してこれを試すには、次のようにします。

doSomething <- function(df) {
    df<-df+1-1
return(df)
}
myframe<-doSomething(myframe)

上記のコードを実行すると、メモリ使用量が 160 MB 程度まで跳ね上がります。gc() を実行すると、35 MB に戻ります。

では、これらすべてをどうすればよいのでしょうか。関数の外で操作を行うことは、関数内で行うよりも (メモリの点で) それほど効率的ではありません。ガベージ コレクションは本当に素晴らしいものをクリーンアップします。gc() を強制的に実行する必要がありますか? おそらく、必要に応じて自動的に実行されるわけではありませんが、上記で実行して、メモリ使用量にどのように影響するかを示しました。

それが役立つことを願っています!

于 2009-03-04T21:28:26.303 に答える
0

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

1 からすべての変数を含む R の環境を渡すことができます。しかし、おそらく心配する必要はありません。

[クラスでも同様のことができるかもしれません。私は現在、ポリモーフィック関数にクラスを使用する方法しか理解していません-そして、複数のクラスシステムが動き回っていることに注意してください。]

于 2013-05-01T19:34:15.980 に答える