47 миллиардов кортежей, умноженных на 16 байтов. Каждый кортеж составляет 780 миллиардов байтов, что составляет около 760 ГБ. Ваша машина имеет менее 1/3 памяти, необходимой для этого, поэтому вам действительно нужен другой подход, независимо от причины сбоя вашей программы.
Предложение, которое я могу вам предложить, - использовать файл отображения памяти объемом 1 ТБ для хранения этого массива, и если вам действительно нужно использовать вектор в качестве интерфейса, вы можете написать собственный распределитель для него, который использует отображенную память. Это должно решить вашу нехватку основной памяти квазипрозрачным способом. Если ваш интерфейс требует стандартного вектора со стандартными распределителями, вам лучше его перепроектировать.
Еще один момент, который нужно добавить: проверьте, какое значение вы используете для ulimit
для пользователя, выполняющего процесс, поскольку он может иметь более строгий лимит виртуальной памяти, чем 760 ГБ.