C ++ создает огромный вектор - PullRequest
0 голосов
/ 04 июля 2018

Для процесса, который я пытаюсь запустить, мне нужно иметь std::vector из std::tuple<long unsigned int, long unsigned int>. Тест, который я сейчас делаю, должен создать вектор из 47 614 527 250 (около 47 миллиардов) кортежей, но на самом деле происходит сбой при создании с ошибкой terminate called after throwing an instance of 'std::bad_alloc'. Моя цель - использовать этот скрипт с вектором, примерно в два раза превышающим этот размер. Код такой:

arc_vector = std::vector<std::tuple<long unsigned int, long unsigned int>>(arcs);

, где arcs - это long unsigned int с приведенным значением.

Могу ли я, и в таком случае, как мне увеличить объем памяти? Этот сценарий выполняется на 40-ядерном компьютере с объемом памяти около 200 ГБ, поэтому я знаю, что сама память не является проблемой.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

47 миллиардов кортежей, умноженных на 16 байтов. Каждый кортеж составляет 780 миллиардов байтов, что составляет около 760 ГБ. Ваша машина имеет менее 1/3 памяти, необходимой для этого, поэтому вам действительно нужен другой подход, независимо от причины сбоя вашей программы.

Предложение, которое я могу вам предложить, - использовать файл отображения памяти объемом 1 ТБ для хранения этого массива, и если вам действительно нужно использовать вектор в качестве интерфейса, вы можете написать собственный распределитель для него, который использует отображенную память. Это должно решить вашу нехватку основной памяти квазипрозрачным способом. Если ваш интерфейс требует стандартного вектора со стандартными распределителями, вам лучше его перепроектировать.

Еще один момент, который нужно добавить: проверьте, какое значение вы используете для ulimit для пользователя, выполняющего процесс, поскольку он может иметь более строгий лимит виртуальной памяти, чем 760 ГБ.

0 голосов
/ 04 июля 2018

У вас вполне может быть машина с большим объемом памяти, но проблема в том, что вам требуется, чтобы эта память была непрерывной .

Даже с виртуализацией памяти это маловероятно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...