Большой объем 3D bad_alloc

Я разрабатываю приложение, которое создает трехмерную диаграмму Вороного, созданную из трехмерного облака точек, с использованием динамического выделения multi_array для динамического хранения всей диаграммы.

Для одного из тестовых случаев, которые я использую, требуется большой объем памяти (около [600][600][600]), что превышает допустимый предел и приводит к bad_alloc.

Я уже пытался разделить диаграмму на маленькие части, но она также не работает, так как кажется, что общий объем памяти уже превышен.

У меня вопрос, как я могу работать с таким большим 3D-объемом в условиях ПК?

*РЕДАКТИРОВАТЬ

Тип Element представляет собой следующую структуру:

struct Elem{
  int R[3];
  int d; 
  int label;
}

Элементы индексируются в мульти-массиве в зависимости от их положения в трехмерном пространстве.

Многолинейный массив создается путем задания определенных точек в пространстве из файла и последующего заполнения промежуточных пространств путем передачи маски вперед и назад по всему пространству.

заранее спасибо

2 ответа

Вы не упомянули тип элемента. Дайте элемент четырехбайтовый floatматрица 600*600*600 занимает всего около 820 Мбайт, что на самом деле не очень много. Я бы посоветовал вам проверить ограничение вашей операционной системы на использование памяти на процесс. Для Linux, проверьте это с ulimit -a,

Если вы действительно не можете выделить матрицу в памяти, создайте файл нужного размера на карте, сопоставьте его с памятью, используя mmap, Затем передайте адрес памяти, возвращенный mmap в boost::multi_array_ref,

Вы не сказали, как вы получаете все свои очки. Если вы читаете их из файла, не читайте их все. Если вы их вычислите, то, возможно, вы сможете пересчитать их по мере необходимости. В обоих случаях вы можете реализовать некоторый кеш, который будет хранить наиболее часто используемые. Если вы знаете, как ваш алгоритм будет использовать данные, то вы можете предсказать, какие значения понадобятся дальше. Вы даже можете сделать это в другой теме.

Второе решение - работать с вашими данными, чтобы они помещались в вашей оперативной памяти. У вас есть 216 миллионов баллов, но мы не знаем, каков размер балла. Они 3D, но используют ли они поплавки или двойные? Это классы или простые структуры? У них есть vtables? Вы используете отладочную сборку? (в Debug объекты могут быть больше). Вы выделяете весь массив в начале или постепенно? Я считаю, что не должно быть проблем с хранением 216M 3D-точек на текущем ПК, но это зависит от ответов на все эти вопросы.

Третий способ, который приходит мне в голову - это использовать файлы с отображением в памяти, но я никогда не использовал их лично.


Вот несколько вещей, чтобы попробовать:

Попробуйте выделить в разных пакетах, например: 1 * 216M, 1k * 216k, 1M * 216, чтобы увидеть, сколько памяти вы можете получить.

Попробуйте изменить карту повышения на std::vector и даже raw void* и сравните максимальный объем ОЗУ, который вы можете получить.

Другие вопросы по тегам