12

選択したデータのコピーを作成せずに、オブジェクト (データ フレーム、行列、ベクトル) からサブセットを選択する方法はありますか?

私は非常に大きなデータセットを扱っていますが、それらを変更することはありません。ただし、便宜上、操作するデータのサブセットを選択することがよくあります。毎回大規模なサブセットのコピーを作成するのはメモリ効率が非常に悪いですが、通常のインデックス作成とsubset(およびxapply()関数ファミリーの) 両方で、選択したデータのコピーが作成されます。そこで、この問題を克服できる関数またはデータ構造を探しています。

私のニーズに合うかもしれないいくつかの可能なアプローチは、うまくいけばいくつかのRパッケージに実装されています:

  • コピー オン ライトメカニズム。つまり、既存の要素を追加または書き換えるときにのみコピーされるデータ構造。
  • データ構造のインデックス情報のみを再作成する必要があり、その内容を必要としない不変データ構造(長さと同じ char 配列へのポインターを保持する小さなオブジェクトのみを作成することによって、文字列から部分文字列を作成するなど)。
  • xapply()サブセットを作成しない類似体。
4

1 に答える 1

7

パッケージrefを試してください。具体的には、そのrefdataクラスです。

あなたが見逃しているかもしれないのdata.tableは、(by=パラメータ)をグループ化するときにデータのサブセットがコピーされないため、高速であることです。[技術的には、それらは各グループで再利用されるメモリの共有領域にあり、C の R の for ループよりもはるかに高速な memcpy を使用してコピーされます。]

:=indata.tableは、in を変更する 1 つの方法data.tableです。 書き込み時にコピーされないdata.tableという点で、通常の R プログラミング スタイルとは異なります。関数内であっても、(潜在的に非常に大きな) テーブルをコピーするには、ユーザーが明示的に呼び出す必要があります。copy()

refdataに組み込まれているようなメカニズムがないことは正しいですdata.table。あなたの言いたいことはわかりますし、それは素晴らしい機能です。refdataただし、で動作するはずでdata.tableあり、問​​題ない場合がありますdata.frame(ただし、コピーを必ず監視してtracemem(DF)ください)。

あなたが試すことができるパッケージにはidata.frame(immutable )もあります。data.frameplyr

于 2012-03-06T13:05:19.823 に答える