Я определил вектор размера 2 в c++, что его размеры слишком велики. определение воктора таково:
vector<vector<string> > CommunityNodes(3600, vector<string>(240005));
когда я запускаю программу, у меня есть следующая ошибка:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
перед тем, как я запустил программу, я возьму следующую команду в строке консоли, в которой размер стека будет неограничен:
ulimit -s unlimited
но снова у меня есть ошибка распределения. Как я могу определить такой большой вектор в c++?
Предположим, что реализация std::string
содержит один 32-разрядный указатель на его содержимое, один 32-битный int для текущей длины строки и один 32-разрядный int для текущего размера выделения.
Это дает нам 12 байт на строку * 240005 строк в строке * 3600 строк, которая работает до 9,7 гигабайт - значительно больше, чем вы можете иметь дело с 32-битной реализацией. Хуже того, реализация может легко разместить эту 12-байтную строку до 16 байтов, тем самым увеличив требуемую память еще больше.
Если вы перейдете к 64-битной реализации, вы можете адресовать больше памяти, но размер, вероятно, удвоится, поэтому вам понадобится примерно 20 гигабайт памяти, чтобы хранить массивы пустых строк. Добавьте некоторое фактическое содержимое, и вам нужно еще больше (и, опять же, строка может быть легко дополнена, чтобы быть еще больше).
Итак, да, с 64-битной реализацией это, вероятно, можно заставить работать, но это непрактично для большинства целей. Вероятно, вам нужно/нужно найти способ уменьшить количество используемых вами строк.
Попытка заранее выделить столько места говорит о том, что вы принимаете неправильный подход к проблеме. Я подозреваю, что большинство узлов в двойном векторе будут пустыми. Если это так, вам будет гораздо лучше с чем-то вроде двойной карты вместо двойного вектора:
std::map< int, std::map< int, std::string > > CommunityNodes();
Затем вы создаете только записи, которые должны иметь, вместо предварительного распределения всего массива.
Обратите внимание: с помощью оператора [] оператор автоматически создаст узел, даже если вы ему ничего не назначили. Если вы не хотите создавать узел, используйте "find()" вместо "[]".