1

R パッケージ用に C で関数を開発していますが、ガベージ コレクションされていない手動で割り当てられたメモリで R 数値ベクトルを初期化する必要があります。

標準関数 allocVector(REALSXP, XXX) がメモリを割り当て、オブジェクトを初期化します。私はすでに割り当てられたメモリを持っています。このメモリで R オブジェクトを初期化し、それをユーザー空間に返す必要があります。

私が従おうとしているアルゴリズム

  1. 自分でメモリを割り当てます(実際にはメモリマップファイルです)

  2. R オブジェクト (標準の R 数値ベクトル) をこのメモリに入れます (どのように?)

  3. ガベージコレクターがそれを収集しようとするのを防ぎます (どのように?)

  4. このオブジェクトのファイナライザーを登録する

  5. Return R オブジェクト ユーザーはそれを使用できます

  6. オブジェクトが参照されなくなったという通知を受け取り、オブジェクトの割り当てを解除します

4

1 に答える 1

4

あなたの問題は 1. から始まります。R 拡張機能の記述マニュアルでは、R に返すオブジェクトには R のメモリ「プール」を使用する必要があると書かれているため(不可解な方法で、セクション 5.9.2を参照)、R を解放するにはどうすればよいでしょうか。アクセスを制御しない場合のオブジェクトのメモリ?

外部ポインターを使用しない限り、同じマニュアルや他の場所 (ここでの他の質問、r-devel アーカイブ、いくつかのパッケージなど) で (ある程度) カバーされています。

そして、R パッケージのbigmemoryはこれをほぼ正確にカバーしています (関連する bigmemoryの Web サイトも参照してください。お望みであれば、bigmemory から始めて、そこからパッケージ 'mmapmemory' を派生させることができます。ああ、パッケージmmapがありますが、多分あなたはすでにそれを知っていました。

于 2013-01-17T14:06:43.903 に答える