[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