Problemas con la asignación de grandes vectores
Pregunta
tengo el siguiente programa.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <ctime>
#include <cmath>
#include <RInside.h>
using std::cout;
using std::endl;
using std::vector;
using namespace Rcpp;
int main(int argc, char** argv){
RInside R;
R.parseEvalQ("set.seed(1)"); Rcpp::RNGScope();
const Function sample("sample");
vector<int> vv = as<vector<int> >(sample(NumericVector::create(0,1,2,3), 1e6, true,NumericVector::create(.3,.3,.2,.2)));
cout<<"1"<<endl<<std::flush;
const vector<int> vv2 = as<vector<int> >(sample(NumericVector::create(0,1,2,3), 2e6, true,NumericVector::create(.3,.3,.2,.2)));
cout<<"2"<<endl;
}
La salida es
1
Segmentation fault
Esto significa que el vector C++ vv2
no se puede inicializar.¿Por qué no puede vv2 ser asignado?
Con en línea, aquí es lo que tengo:
> body <- '
+ using namespace Rcpp;
+ using std::vector;
+ using std::cout;
+ using std::endl;
+ Rcpp::RNGScope();
+ const Function sample("sample");
+ vector<int> vv = as<vector<int> >(sample(NumericVector::create(0,1,2,3), 1e6, true,NumericVector::create(.3,.3,.2,.2)));
+ cout<<"1"<<endl<<std::flush;
+ const vector<int> vv2 = as<vector<int> >(sample(NumericVector::create(0,1,2,3), 2e6, true,NumericVector::create(.3,.3,.2,.2)));
+ cout<<"2"<<endl;
+ List vecs(2);
+ vecs[1]=vv;
+ vecs[1]=vv2;
+ return(vecs);
+ '
> require( inline )
Loading required package: inline
> require( Rcpp )
Loading required package: Rcpp
Loading required package: int64
>
> signatures <- NULL
> fx <- cxxfunction( signatures, body, plugin = "Rcpp" )
> a <- fx()
*** caught segfault ***
address 0x7f2b850eb013, cause 'memory not mapped'
Traceback:
1: .Primitive(".Call")(<pointer: 0x7f2b8627d2c0>)
2: fx()
Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Solución
¿Puede hacer lo mismo en R en su máquina?2 millones de elementos es bastante.
Además, casi nunca vuelvo a llamar a las funciones R de esta manera, ya que es ineficiente.Si desea acelerar, vuelva a implementar sample()
en C ++, que no puede ser demasiado difícil.
A continuación, también recomendaría una expresión más simple que se pruebe primero en línea.
Por último, y sonaré como un disco rayado, prueba la lista rcpp-devel.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow