Я сталкиваюсь с тем, что, вероятно, является проблемой памяти с кодом С++, связанным с Rcpp. Я мог бы придумать следующий минимальный тестовый пример:
тест.Р:
require(Rcpp)
sourceCpp("test.cpp")
N <- 698153
testCpp(N)
test.cpp:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
void testCpp(int N) {
double closestLandmarks[N];
int closestLandmarksIdx[N];
IntegerVector l(10);
// Fill the double and int vectors
for (int j = 0; j < N; j++) {
closestLandmarks[j] = 1;
closestLandmarksIdx[j] = 2;
} // j
return;
}
Запуск Rscript test.R
приводит к переполнению стека: Error: segfault from C stack overflow
. По сути, этот код выделяет два массива размера N (неважно, являются ли они целыми или двойными, они будут падать одинаково), создает экземпляр IntegerVector размера 10 и заполняет первые 2 позиции массивов. Я могу в основном удалить любую строку здесь, и она не рухнет. Он также не будет падать с N ‹ 698153 (это критическое число немного варьируется от машины к машине... 500000 кажется всегда безопасным, в то время как 1e6 падает везде). Он выйдет из строя, если я буду повторять только до j ‹ 2 вместо j ‹ N, то есть когда он попытается заполнить 2-ю позицию массивов.
Я не совсем понимаю, почему я должен столкнуться с проблемами памяти с двумя массивами, которые я считаю довольно маленькими (‹ 106) и очень маленьким IntegerVector. На моей машине много свободной оперативной памяти (5 ГБ из 24 ГБ), и я могу без проблем использовать гораздо большие векторы/матрицы в R.
Я явно пропускаю что-то очень глупое здесь. Что не так с моим кодом?
double closestLandmarks[N];
(гдеN
— переменная), даже не должен компилироваться (или, по крайней мере, должен выдавать предупреждение!), это массив переменной длины и это C99 и не стандартный С++ - person gx_   schedule 14.06.2013