У меня есть код MATLAB, который отлично работает с двойными записями 20 000 000 × 6.
Я преобразовал тот же код в cC++ и использовал вектор для хранения этих записей, но это доставило мне bad_alloc
проблему.
Это моя структура:
typedef struct Affine
{
double a11;
double a12;
double a13;
double a21;
double a22;
double a23;
};
У меня есть один вектор, хранящий исходное предположение о конфигурациях, названных configs, который содержит 20 000 000× Affine
записей.
Я должен изменить эти записи на аффинные, которые я создал таким образом.
Affine affines;
affines.a11 = 0;
affines.a12 = 0;
affines.a13 = 0;
affines.a21 = 0;
affines.a22 = 0;
affines.a23 = 0;
vector<Affine> matrixConfigs_mex(configs.size(), affines);
но он не может выделить память.
У меня 10 ГБ ОЗУ, MATLAB работает отлично с тем же количеством конфигураций. Может ли кто-нибудь помочь и сказать мне, как это исправить?
configs.max_size()
возвращает 89 478 485
Окружающая среда Windows 7 10GB ram, Microsoft Visual Studio 2015 Matlab 2015.
Пример проверки моего кода выглядит следующим образом:
// Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x86
#include <vector>
#include <iostream>
struct Affine
{
double a11;
double a12;
double a13;
double a21;
double a22;
double a23;
};
int main()
{
Affine affine;
affine.a11 = 0.1;
affine.a12 = 0.1;
affine.a13 = 0.1;
affine.a21 = 0.1;
affine.a22 = 0.1;
affine.a23 = 0.1;
std::vector<Affine> test1(20000000, affine);
std::vector<Affine> test(test1.size(), affine);
std::cout << test[10000].a11;
}
Affine
объектов в векторе. - person PaulMcKenzie   schedule 28.11.201620000000x6
? 120 миллионов? - person Alexey Andronov   schedule 28.11.20166 records of structure.
-- Это не ясно. Это вектор из 20000000 аффинных объектов? - person PaulMcKenzie   schedule 28.11.2016std::vector
требует непрерывной памяти, а виртуальное адресное пространство содержит другие вещи, кроме ваших векторов). Тот факт, что у вас 10 ГБ оперативной памяти, совершенно не имеет значения, вас здесь сдерживает размер виртуального адресного пространства, которое фиксировано. Самый простой способ решить эту проблему и использовать имеющуюся у вас оперативную память — это скомпилировать вашу программу в 64-битном режиме. - person Matteo Italia   schedule 28.11.2016