在Rcpp中分配一个大型的二维数字向量数组



我试图分配一个大的(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真的是一个数字向量列表)。

最新更新