2015-03-16 4 views
1

У меня есть класс, который содержит 4 целых числа. Мне нужно создать 1 миллион экземпляров вышеуказанного класса. Как мне создать ..?Память Организация больших данных

Наивный подход: Класс arrMyObjectes [1000000];

Но нужно 1million * SizeOf (OBJ) = 16Millions байт непрерывного блока памяти ****, который будет трудно получить ..

Лучше подход будет: * Класс arrMyObjectes []; 1000000

Теперь мы создадим объекты, используя 1000000 новый и мы будем хранить указатели в упомянутом выше массиве указателей ... Даже в этом случае нам нужно 1 миллионы * SizeOf (указатель) = 4million байт непрерывный блок памяти .. тоже кажется трудно получить ..

Есть ли другой лучший подход.

+0

Возможно, вы захотите попробовать 'std :: vector < MyClass> container (100000);'. Вектор выделяет память динамически. –

+0

Вам ** нужен ** доступ ко всем предметам одновременно? –

+0

16MB непрерывной памяти довольно легко найти на рабочем столе. Также тот факт, что память смежна, будет иметь ** потрясающие ** (полезные) эффекты на производительность, если вы производите линейную обработку. –

ответ

3

Что относительно std::deque<Class> objects(1000000); или std::list<Class> objects(1000000);. Эти контейнеры не соприкасаются друг с другом.

В случае реализации пытается захватить непрерывный блок для этих конструкторов вы можете генерировать их по отдельности:

std::deque<Class> objects; 
for(unsigned i = 0; i < 1000000; ++i) 
    objects.emplace_back(); 

То же самое для std::list.

Ссылка:std::dequestd::list

2

16 МБ или 4MB не то, что трудно получить, если у вас есть 2 Гб оперативной памяти или больше. На самом деле это может быть лучше, если вы перейдете к нему.

В противном случае вы можете использовать непересекающийся контейнер, как упомянуто Galik, но для небольших предметов (а ваш класс - 16 байт) это действительно не оптимально, поскольку он фрагментирует память и предполагает, что вы на 64-битной машине использует 8 дополнительных байтов на элемент, для указателя. 4 дополнительных байта, если вы находитесь на 32-битной машине.

Значение вы на самом деле использовать 24 МБ (раздробленной) памяти вместо 16.

Короткая версия: если вы манипулируете мелкие предметы (например, ваш класс), придерживаться использования векторов, это позволит повысить производительность и память Применение. 16 Мб непрерывной памяти сейчас не так уж и много.

Смежные вопросы