我试图分配一个大的(ish) 2D NumericVectors数组(总内存应该只有16Mb左右,禁止开销),但我得到堆栈溢出。下面是我能想到的最小的可复制示例:
require(Rcpp)
require(inline)
testfun = cxxfunction(
signature(x="list"),
body='using namespace std;
vector<vector<NumericVector> > rs=as< vector<vector<NumericVector> > >( x );
return wrap(rs);',
plugin="Rcpp")
x=lapply(1:1000,function(g) lapply(1:1000, function(h) runif(3)))
testfun(x)
分析与gdb只有告诉我,我非常深的lib。所以递归。请注意,虽然这里的数组是矩形的,所以我可以使用NumericMatrix代替在我的实际问题中,它们将是锯齿状的。谢谢你的建议。
编辑:使用(相当新的)ListOf<T>
模板类的解决方案:
require(Rcpp)
require(inline)
testfun = cxxfunction(
signature(x="list"),
body='using namespace std;
ListOf<ListOf<NumericVector> > rs=as< ListOf<ListOf<NumericVector> > >( x );
return wrap(rs);',
plugin="Rcpp")
x=lapply(1:1000,function(g) lapply(1:1000, function(h) runif(3)))
testfun(x)
我们只是用Rcpp::ListOf
替换对std::vector
的任何调用,并且,有点神奇地,它工作了。最重要的是,这里没有复制数据(假设x
真的是一个数字向量列表)。