С++ std::bad_alloc с двойными записями около 20 000 000x6

У меня есть код 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;
}

person Mudasar    schedule 28.11.2016    source источник
comment
Какая операционная система? Какой компилятор? Какая командная строка?   -  person David Schwartz    schedule 28.11.2016
comment
я добавил это в описание.   -  person Mudasar    schedule 28.11.2016
comment
Невозможно дублировать с помощью Visual Studio 2015   -  person PaulMcKenzie    schedule 28.11.2016
comment
такая же среда? configs и matrixConfigs_mex содержат более 20000000 записей.   -  person Mudasar    schedule 28.11.2016
comment
@Mudasar Опубликуйте минимально воспроизводимый пример, который дублирует проблему. Ссылка показывает, что нет проблем с 20000000 Affine объектов в векторе.   -  person PaulMcKenzie    schedule 28.11.2016
comment
Что означает 20000000x6? 120 миллионов?   -  person Alexey Andronov    schedule 28.11.2016
comment
@ sfk92fksdf означает, что 6 записей структуры.   -  person Mudasar    schedule 28.11.2016
comment
@Mudasar 6 records of structure. -- Это не ясно. Это вектор из 20000000 аффинных объектов?   -  person PaulMcKenzie    schedule 28.11.2016
comment
@PaulMcKenzie да, ты прав.   -  person Mudasar    schedule 28.11.2016
comment
@PaulMcKenzie проверить пример, который я опубликовал   -  person Mudasar    schedule 28.11.2016
comment
Итак, вы создаете 2 вектора? Это 2 ГБ, и он не работает. Я предполагаю, что именно ОС ограничивает вашу программу от выделения такого большого объема памяти. Например, у нее нет двух непрерывных блоков памяти по 1 ГБ, или вы превышаете пространство, предоставленное вашему процессу (что составляет 2 ГБ на 32-разрядной версии)   -  person Alexey Andronov    schedule 28.11.2016
comment
@ sfk92fksdf 1,2 ГБ на самом деле является ограничением для 32-битной Windows 7, если только двоичный файл не поддерживает большие адреса (посмотрите). Но если OP использует x64, он должен проверить, действительно ли он компилирует 64-битный код.   -  person Swift - Friday Pie    schedule 28.11.2016
comment
Каждый вектор имеет размер 960 МБ, а 32-разрядный процесс имеет 2 ГБ виртуального адресного пространства; они не подходят (тем более, что std::vector требует непрерывной памяти, а виртуальное адресное пространство содержит другие вещи, кроме ваших векторов). Тот факт, что у вас 10 ГБ оперативной памяти, совершенно не имеет значения, вас здесь сдерживает размер виртуального адресного пространства, которое фиксировано. Самый простой способ решить эту проблему и использовать имеющуюся у вас оперативную память — это скомпилировать вашу программу в 64-битном режиме.   -  person Matteo Italia    schedule 28.11.2016
comment
@ sfk92fksdf спасибо за ответ. Мой OP 64-битный, позвольте мне проверить компиляцию 64-битного кода.   -  person Mudasar    schedule 28.11.2016
comment
@Swift Я нашел число 1,75 ГБ, но опять же, это теоретическое число, так что реальную сумму сложно угадать :)   -  person Alexey Andronov    schedule 28.11.2016
comment
На самом деле это сильно зависит от размера отдельных выделений и от dll/материалов, которые могут быть загружены. Если антивирусная dll, внедренная во все процессы, принудительно загружается на границе 1 ГБ, вы не собираетесь выделять ни одного блока больше этого.   -  person Matteo Italia    schedule 28.11.2016
comment
@ sfk92fksdf Думаю, это общий размер изображения, 2 ГБ за вычетом того, что использует ОС. куча меньше, но да, вы правы, дефрагментация тоже играет роль. Я исходил из предположения, что это среда выполнения VS и MS.   -  person Swift - Friday Pie    schedule 28.11.2016