Cur*_*rge 3 c++ memory r matrix rcpp
这是一个跟进到先前的问题在这里存储和使用XPTR在内存中检索矩阵-这是飞驰的回答-非常感谢你.现在我可以使用xptr在内存中创建和检索矩阵如何正确地完成/销毁对象.Rcpp对象应该在删除时自动进行垃圾收集,但是当我创建指针时,如果我在RI中删除它必须运行gc()两次以恢复内存,例如
// This function wraps the matrix an returns a pointer
// [[Rcpp::export]]
SEXP writeMemObject(NumericMatrix mat)
{
XPtr<NumericMatrix> ptr(new NumericMatrix(mat), true);
return ptr;
}
Run Code Online (Sandbox Code Playgroud)
检索矩阵的函数(从上一个答案)
// [[Rcpp::export]]
NumericMatrix getMemObject(SEXP ptr)
{
XPtr<NumericMatrix> out(ptr);
return *out;
}
Run Code Online (Sandbox Code Playgroud)
然后在R
createMemMatrix <- function(dims){
ptr <- writeMemObject(matrix(runif(prod(dims)), nc = dims[2]))
return(ptr)
}
ptr <- createMemMatrix(c(1e4, 1e4))
#mat <- getMemObject(ptr) # this works but not run here
rm(ptr);
gc(); # nothing seems to happen in memory
gc(); # memory is freed (visible in system monitor)
Run Code Online (Sandbox Code Playgroud)
在bigmemory[R包是在答复中提到前面的问题和他们的对象存储马上释放
# In R
require(bigmemory)
# be careful this is a large matrix
x1 <- big.matrix(ncol = 1e4, nrow = 1e4)
x1[,] <- runif(1e8)
rm(x1)
gc() # memory is freed right away (visible on system monitor)
Run Code Online (Sandbox Code Playgroud)
我尝试了在bigmemory包中使用的类似方法,并在创建时注册指针:
// C function for destroying the matrix behind the pointer
void destroyItem(SEXP ptr)
{
NumericMatrix *pm=(NumericMatrix*)(R_ExternalPtrAddr(ptr));
delete pm;
R_ClearExternalPtr(ptr);
}
// This function wraps the matrix an returns a pointer
// [[Rcpp::export]]
SEXP writeMemObject(NumericMatrix mat)
{
XPtr<NumericMatrix> ptr(new NumericMatrix(mat), true);
R_RegisterCFinalizerEx(ptr, (R_CFinalizer_t) destroyItem, (Rboolean) TRUE);
return ptr;
}
Run Code Online (Sandbox Code Playgroud)
但这并没有什么不同.该bigmemory包是伟大的,但我认为这是值得使用RCPP对象,因为大范围的对象都可以存储在内存中这样做.
R有一代分类垃圾收集器,例如参见R internals的这一部分.因此,gc()每次调用可能不会触发完整的集合.
另外,请注意XPtr已经注册了一个调用的终结器delete,因此您不需要注册destryItem终结器.除了delete指针之外,您只需要注册一个终结器来执行某些操作.幸运的是,由于你没有得到双重删除,R_ClearExternalPtr但无论如何这都是危险的.