1

私のRパッケージでは、関数を実装するCコードは、使用するためにメモリを割り当てます。この記憶はどうなりますか?それはRのGCのレーダーの下にあるのでしょうか、それともメモリリークでしょうか?Rのガベージコレクションの下にある場合、このメモリは再利用されますか?

サーバーとして実行されているRのサーバープロセスに割り当てられる5GBの巨大なデータがあります。ここで、Javaの外部ヒープメモリ割り当てのように、GCのレーダーからこのメモリを割り当てることができれば良い考えです。したがって、基本的に、Rがそのメモリを妨害することなく、Cコードに大量のメモリを割り当てることはできますか?

mallocまたはcallocを使用してメモリを割り当てることを計画しています。

4

2 に答える 2

3

これは、「R拡張機能の記述」でかなり明確に説明されています。同じメモリプールにアクセスするcalloc()/のRバリアントを使用します。malloc()そうすれば、Rはgc()これらのことを実行でき、なぜ必要なのPROTECT()UNPROTECT()

6.1.2ユーザー制御のメモリ

メモリ割り当てのもう1つの形式は、へmallocのインターフェイスです。このインターフェイスは、Rエラー処理を提供します。このメモリは、ユーザーが解放するまで存続し、Rワークスペースに割り当てられたメモリに追加されます。

インターフェース機能は

 TYPE* Calloc(size_t N, TYPE)
 TYPE* Realloc(ANY *P, size_t N, TYPE)
 void Free(ANY *P)

calloc、、reallocおよびの類似体を提供しfreeます。割り当て中にエラーが発生した場合はRによって処理されるため、これらのルーチンが返された場合、メモリは正常に割り当てまたは解放されています。 Free ポインタPをに設定しますNULL。(Sのすべてのバージョンではありませんが、一部のバージョンがそうします。)

Freeユーザーは、エラーやユーザー割り込みなど、不要になったときにこのメモリを調整する必要があります。これは、多くの場合on.exit、呼び出し元のR関数のアクション から最も便利に実行できpwilcoxます。例を参照してください。

Calloc/によって割り当てられたメモリReallocが、によって使用されるのと同じプールからのものであると想定しないでください。malloc特に、それを使用しない freestrdupください。

これらのエントリポイントには、定義済みのR_if をプレフィックスとして付ける必要があります。STRICT_R_HEADERS

于 2012-12-07T14:40:17.613 に答える
0

データ分析のためのChambersのソフトウェアから:

計算によってRストレージが動的に割り当てられる可能性があり、結果がRレベルで割り当てられない場合は常に、対応するC参照の使用をPROTECTマクロとUNPROTECTマクロで保護する必要があります。その理由は、そうでなければRでストレージが解放され、計算中に動的ストレージのガベージコレクションが行われるためです。

于 2012-12-07T11:25:23.153 に答える