An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-devel/attachments/20111227/91b56dc2/attachment.pl>
Initializing a large data structure to be accessed strictly within a shared C library
3 messages · Duncan Murdoch, James Muller
On 11-12-27 5:58 PM, James Muller wrote:
Dear R-devel members, The question: Is it possible to initialize and later free a large data structure strictly within a shared C library, to be used by a function in the C library that I'll call from R--without ever having to pass data to and from R? This is analogous to C++ object initialization/use/destruction, but if possible I'd like to stay in C.
Yes, if you use malloc or Calloc you'll get memory that you can manage yourself. See Writing R Extensions, section 6.1.2. Duncan Murdoch
The context: I'm implementing a particle swarm optimization of a 60-dimension nonlinear transform, where the transform is defined in a half-gigabyte dataset. By carefully initializing a C struct I can trim a large amount of work from the PSO iteration stage. This is, of course, straight forward if I implement the whole thing in a self-contained C program--however, I'd like R to handle the optimization routines, and my shared library to implement the value function. So: what do folks think? Cheers, James [[alternative HTML version deleted]]
______________________________________________ R-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Thanks Duncan, you've unclogged my thinking. For anybody interested,
see below a sketch of the solution.
Cheers,
James
--START SKETCH OF SOLUTION--
#include <R.h>
#include <Rinternals.h>
static typedef struct {
int nrow, ncol;
double *data;
} _myparticle_data_struct;
static _myparticle_data_struct myparticle_data;
void myparticle_init() {
// Before we begin, call this from .Call() to Ralloc() memory and load the
// data into to myparticle_data.data
}
void myparticle_free() {
// When we're done with the PSO, .Call() to Free() the data
}
void myparticle_eval(double *value, double *x) {
// .Call() to evaluate the value *value given vector x[]
}
--END SKETCH OF SOLUTION--