[Rcpp-devel] How to free memory in Rcpp

Romain Francois romain at r-enthusiasts.com
Fri Dec 14 17:04:29 CET 2012


I dont know. This looks like a deeply hidden problem. 

Maybe you can enable some rcpp debugging by adding 

#define RCPP_DEBUG_LEVEL 1 

Before you include Rcpp.h, this will give you verbose output, maybe this will help locating the issue. 

Romain

Envoyé de mon iPhone

Le 14 déc. 2012 à 16:31, Honglang Wang <wanghonglang2008 at gmail.com> a écrit :

> Hi Romain,
> Thanks very much. I tried your method. And now the old error has gone, which is really good for me. But a new error is :
> Error in betahat(ker, x, X, y, t, h, m) :
>   (list) object cannot be coerced to type 'double'
> Calls: system.time ... apply -> FUN -> betahat -> .External -> cpp_exception
> Execution halted
> 
> What should I do? Do I have to do like:
> arma::colvec betahat0(betahat.begin(),betahat.size()/2,false);
> NumericVector betahat00(p);
> betahat00 = betahat0;
> return List::create(Named("betahat") = betahat00);
> 
> Best wishes!
>  
> Honglang Wang
>  
> Office C402 Wells Hall
> Department of Statistics and Probability
> Michigan State University
> 1579 I Spartan Village, East Lansing, MI 48823
> wangho16 at msu.edu
> 
> 
> 
> On Fri, Dec 14, 2012 at 2:09 AM, Romain Francois <romain at r-enthusiasts.com> wrote:
>> Le 14/12/12 03:15, Honglang Wang a écrit :
>>> Hi,
>>> Here is the sample code:
>>> // [[Rcpp::export]]
>>> List betahat(Function ker, double t0, NumericMatrix Xr, NumericMatrix
>>> yr, NumericVector tr, double h, int m) {
>>>    int n = Xr.nrow(), p = Xr.ncol();
>>>    arma::mat X(Xr.begin(), n, p, false);
>>>    arma::mat y(yr.begin(), n, 1, false);
>>>    arma::colvec t(tr.begin(), tr.size(), false);
>>>    arma::mat T = X;
>>>    T.each_col() %= (t-t0)/h;
>>>    arma::vec K =as<arma::vec>(ker(tr-t0,h))/
>>> m;
>>>    double L1 = arma::accu(K%X.col(0)%X.col(0));
>>>    double L2 = arma::accu(K%X.col(0)%X.col(1));
>>>    double L3 = arma::accu(K%X.col(1)%X.col(1));
>>>    double L4 = arma::accu(K%X.col(0)%T.col(0));
>>>    double L5 = arma::accu(K%X.col(1)%T.col(0));
>>>    double L6 = arma::accu(K%X.col(1)%T.col(1));
>>>    double L7 = arma::accu(K%T.col(0)%T.col(0));
>>>    double L8 = arma::accu(K%T.col(0)%T.col(1));
>>>    double L9 = arma::accu(K%T.col(1)%T.col(1));
>>>    double R1 = arma::accu(K%X.col(0)%y);
>>>    double R2 = arma::accu(K%X.col(1)%y);
>>>    double R3 = arma::accu(K%T.col(0)%y);
>>>    double R4 = arma::accu(K%T.col(1)%y);
>>>    arma::mat L(2*p,2*p);
>>>    L(0,0)=L1;L(0,1)=L2;L(0,2)=L4;L(0,3)=L5;
>>>    L(1,0)=L2;L(1,1)=L3;L(1,2)=L5;L(1,3)=L6;
>>>    L(2,0)=L4;L(2,1)=L5;L(2,2)=L7;L(2,3)=L8;
>>>    L(3,0)=L5;L(3,1)=L6;L(3,2)=L8;L(3,3)=L9;
>>>    arma::mat R(2*p,1);
>>>    R(0,0)=R1;R(1,0)=R2;R(2,0)=R3;R(3,0)=R4;
>>>    arma::vec betahat = arma::solve(L,R);
>>> 
>>>    arma::colvec betahat0(betahat.begin(),betahat.size()/2,false);
>>>    return List::create(Named("betahat") = betahat0);
>>> }
>>> 
>>> I will call this function repeatedly, and at some point, it went wrong
>>> with the following error:
>>> Error in betahat(ker, x, X, y, t, h, m) :
>>>    promise already under evaluation: recursive default argument
>>> reference or earlier problems?
>>> Calls: system.time ... apply -> FUN -> betahat -> .External -> cpp_exception
>>> Execution halted
>>> 
>>> I have no idea what's this error. I am just wondering whether I need to
>>> free some memory in this code. Thanks.
>> 
>> You don't. The explicit constructor/destructor scheme of C++ takes care of this automatically for you.
>> 
>> So there is a chance you are victim of a well hidden bug. These are usually related to garbage collection and us not making enough precaution somewhere. This is very hard to track.
>> 
>> As a wild guess, I think it is because Function return you an unprotected SEXP. It does not matter most of the time because you consume it, but sometimes the GC will run and collect your object before as<mat> has a chance to process it.
>> 
>> If my guess is correct, then doing yourself some protection might do the trick, something like:
>> 
>> NumericVector result = ker(tr-t0,h) ;
>> arma::vec K =as<arma::vec>(result)/m;
>> 
>> will do the trick since the result of the function call then gets protected by the "result" object.
>> 
>> If this does not work, then you can do some debugging as indicated by others.
>> 
>> Romain
>> 
>>> Best wishes!
>>> Honglang Wang
>>> Office C402 Wells Hall
>>> Department of Statistics and Probability
>>> Michigan State University
>>> 1579 I Spartan Village, East Lansing, MI 48823
>>> wangho16 at msu.edu <mailto:wangho16 at msu.edu>
>>> 
>>> 
>>> 
>>> 
>>> On Thu, Dec 13, 2012 at 4:57 PM, <romain at r-enthusiasts.com
>>> <mailto:romain at r-enthusiasts.com>> wrote:
>>> 
>>> 
>>>     Hello,
>>> 
>>>     What memory do you want to free ? Can you give an example of code
>>>     where there is memory you'd like to "free" ?
>>> 
>>>     Romain
>>> 
>>>     Le 2012-12-13 22:52, Honglang Wang a écrit :
>>> 
>>>         Dear All,
>>>         How to free memory in Rcpp? What's the command? Thanks.
>>> 
>>>         Best wishes!
>>> 
>>>         Honglang Wang
>>> 
>>>         Office C402 Wells Hall
>>>         Department of Statistics and Probability
>>>         Michigan State University
>>>         1579 I Spartan Village, East Lansing, MI 48823
>>>         wangho16 at msu.edu <mailto:wangho16 at msu.edu> [1]
>>> 
>>> 
>>>         Links:
>>>         ------
>>>         [1] mailto:wangho16 at msu.edu <mailto:wangho16 at msu.edu>
>> 
>> 
>> -- 
>> Romain Francois
>> Professional R Enthusiast
>> +33(0) 6 28 91 30 30
>> 
>> R Graph Gallery: http://gallery.r-enthusiasts.com
>> 
>> blog:            http://romainfrancois.blog.free.fr
>> |- http://bit.ly/RE6sYH : OOP with Rcpp modules
>> `- http://bit.ly/Thw7IK : Rcpp modules more flexible
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20121214/e66d67cc/attachment.html>


More information about the Rcpp-devel mailing list