C++ 在Rcpp中分配大型2D数字向量数组

C++ 在Rcpp中分配大型2D数字向量数组,c++,r,rcpp,C++,R,Rcpp,我试图分配一个大的(ish)2D数值向量数组(总内存应该只有16Mb左右的限制开销),但我得到了堆栈溢出。这是我能想到的最小的可重复的例子: require(Rcpp) require(inline) testfun = cxxfunction( signature(x="list"), body='using namespace std; vector<vector<NumericVector> > rs=as< vector<

我试图分配一个大的(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)
require(Rcpp)
需要(内联)
testfun=cxxfunction(
签名(x=“列表”),
使用名称空间std的body;
向量rs=as(x);
返回包装(rs);',
plugin=“Rcpp”)
x=lappy(1:1000,函数(g)lappy(1:1000,函数(h)runif(3)))
testfun(x)

使用gdb with进行评测只会告诉我,我在libR.so递归中非常深入。请注意,虽然这里的数组是矩形的,所以我可以在实际问题中使用NumericMatrix,但它们将是锯齿状的。谢谢你的想法

编辑:使用(相当新的)
ListOf
模板类的解决方案:

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)
require(Rcpp)
需要(内联)
testfun=cxxfunction(
签名(x=“列表”),
使用名称空间std的body;
ListOf rs=as(x);
返回包装(rs);',
plugin=“Rcpp”)
x=lappy(1:1000,函数(g)lappy(1:1000,函数(h)runif(3)))
testfun(x)

我们只需将对
std::vector
的任何调用替换为
Rcpp::ListOf
,就可以神奇地工作了。最重要的是——数据不会复制到这里(假设
x
实际上是一个数字向量列表)。

你好,凯文-谢谢你的建议,不幸的是,我仍然会用这种方法得到堆栈溢出(请注意,我没有用你放在这里的较小的5x5 2D数组得到它)。我曾经尝试过一些类似的方法,在堆栈上制作一个标准的C 2D数组,但同样没有成功。在启动相应的R进程之前,您可以尝试使用
ulimit
显式设置堆栈大小吗?如果OP想要R向量的“集合”,为什么不作为Rcpp::List绕过Rcpp::NumericVector?混合STL向量和R向量似乎有点冒险。好的一点——嘿,我们还有
ListOf
来明确地处理这类事情。我完全忘了!我目前的解决方案是Rcpp::NumericVectors的std::vector,这样我就可以像rs[I][j]一样得到一个NumericVector。感谢指向ListOf的指针,这更好,ListOf>做了我需要的一切。如果你想把它写进主要答案,我会接受的。德克:我不想使用直接列表,因为每次我想得到一个数字向量时,我都必须做一些类似于((SEXP)rs[I])[j]的事情,这看起来很笨拙。