1

私は C でいくつかの R 拡張機能を作成しています (R から呼び出される C 関数)。

私のコードでは、2 つの異なるデータセットを同時に使用して統計を計算する必要があり、考えられるすべてのペアの組み合わせでこれを実行する必要があります。次に、C 側で計算を続行するには、これらすべての統計 (非常に大きな配列) が必要です。これらのファイルは非常に大きく、通常は 40 GB までです。これが私の問題です。

R によって呼び出された C でこれを行うには、最初にすべてのデータセットを R にロードして、それらを C 関数呼び出しに渡す必要があります。しかし、理想的には、C または Fortran からデータセットに直接アクセスできた場合、次の順序に従って、これらのファイルのうち 2 つだけを同時にメモリ上に維持することができます。

open  file1 - open file2 - compute cov(1,2)
close file2
hold  file1 - open file3 - compute cov(1,3)
... // same approach

ファイルをロード/アンロードできるため、R では問題ありませんが、C または Fortran を呼び出す場合、ファイルをロード/アンロードするメカニズムがありません。それで、私の質問は、.Rdata ファイルを Fortran または C から直接読み込んで、それらを開いたり閉じたりできるかということです。問題への他のアプローチはありますか?

私が読んだ限りでは、答えはノーです。そこで、Rdata から HDF5 への移行を検討しています。

4

1 に答える 1

4

.Callインターフェイスを使用して、C から R 関数を呼び出すことはそれほど難しくありません。したがって、データを入力する R 関数を作成し、それを C から呼び出します。1 つのファイルが完成したら、読み込んだデータを UNPROTECT() します。これを次の図に示します。

## function that reads my data in from a single file
fun <- function(fl)
    readLines(fl)

library(inline)  ## party trick -- compile C code from within R
doit <- cfunction(signature(fun="CLOSXP", filename="STRSXP", env="ENVSXP"), '
    SEXP lng = PROTECT(lang2(fun, filename)); // create R language expression
    SEXP ans = PROTECT(eval(lng, env));       // evaluate the expression
    // do things with the ans, e.g., ...
    int len = length(ans);
    UNPROTECT(2);                     // release for garbage collection
    return ScalarInteger(len);        // return something
')

doit(fun, "call.R", environment())

より簡単なアプローチは、問題を逆にすることです。つまり、2 つのデータ ファイルを読み込み、そのデータで C を呼び出します。

于 2014-11-17T23:43:36.840 に答える