[Rd] Memory management issues

Duncan Murdoch murdoch at stats.uwo.ca
Sun Jul 5 21:46:07 CEST 2009

On 05/07/2009 10:54 AM, Yuri D'Elia wrote:
> Hi everybody,
> I have been interfacing some C++ library code into an R package but
> ran into optimization issues specific to memory management that require
> some insight into the GC.
> One of the C++ libraries returns simple vectors of integers, doubles and
> complex which are allocated and managed from the library itself. I
> cannot know the length of the array beforehand, so I cannot
> pre-allocate that memory through the GC.
> Right now I'm allocating via allocVector and copying all the data in it.
> However, this requires twice the amount of space (and time), and we're
> running out of memory when doing concurrent analysis.
> What I'd would like to do is:
> - "patch" the SEXP returned to R so that DATAPTR() points directly to
>   the required address. 

The normal way to do what you want is to use an "external pointer".  R 
assumes that memory management for those is handled completely 
externally.  External pointers can have finalizers, so when you no 
longer have a need for the object, you can ask the external library to 
release it.

> - create a normal LISTSXP in the package, which holds a reference
>   to all these objects, so that GC never takes place.

The list would hold the external pointers, which act like references.
> - turn these objects read-only, or, at least, ensure that they are
>   never free()d or remalloc()ed. overwriting the contents is not a
>   critical issue.

That won't happen.

I wouldn't try to trick the memory manager into thinking that it 
allocated these things; that will likely just lead to problems.

Duncan Murdoch

> Would that approach work?
> Are there any alternative approaches?
> Any specific advice about turning these objects read-only?
> Thanks in advance.
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

More information about the R-devel mailing list