我正在尝试分配NumericVectors的一个大型(ish)2D数组(总内存应该只有大约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进行性能分析只能告诉我我在libR.so递归方面非常深入。请注意,虽然这里的数组是矩形的,所以我可以使用NumericMatrix代替我的实际问题,它们将是锯齿状的。谢谢你的任何想法。
答案 0 :(得分:2)
编辑:使用(相当新的)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)
我们只是将std::vector
的所有来电替换为Rcpp::ListOf
,而且有点神奇地说,它有效。最重要的是 - 这里不复制数据(假设x
确实是一个数字向量列表)。