[Rcpp-devel] How to free memory in Rcpp

Honglang Wang wanghonglang2008 at gmail.com
Fri Dec 14 16:31:02 CET 2012


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 <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<http://gallery.r-enthusiasts.com>
>
> blog:            http://romainfrancois.blog.**free.fr<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/91bd9525/attachment-0001.html>


More information about the Rcpp-devel mailing list