2D вектор с очень большим размером

0

Я определил вектор размера 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++?

  • 1
    Уменьшите его размер.
  • 0
    Вы пытаетесь выделить массив строк размером: 823,992 МБ, по какой именно причине?
Теги:
g++

2 ответа

3
Лучший ответ

Предположим, что реализация std::string содержит один 32-разрядный указатель на его содержимое, один 32-битный int для текущей длины строки и один 32-разрядный int для текущего размера выделения.

Это дает нам 12 байт на строку * 240005 строк в строке * 3600 строк, которая работает до 9,7 гигабайт - значительно больше, чем вы можете иметь дело с 32-битной реализацией. Хуже того, реализация может легко разместить эту 12-байтную строку до 16 байтов, тем самым увеличив требуемую память еще больше.

Если вы перейдете к 64-битной реализации, вы можете адресовать больше памяти, но размер, вероятно, удвоится, поэтому вам понадобится примерно 20 гигабайт памяти, чтобы хранить массивы пустых строк. Добавьте некоторое фактическое содержимое, и вам нужно еще больше (и, опять же, строка может быть легко дополнена, чтобы быть еще больше).

Итак, да, с 64-битной реализацией это, вероятно, можно заставить работать, но это непрактично для большинства целей. Вероятно, вам нужно/нужно найти способ уменьшить количество используемых вами строк.

  • 0
    я запускаю свою программу в виртуальной машине с 32 гигабайтами приемлемым. ОС Ubuntu 10.04 64 бит. но все же у меня есть проблема. разве нет другого решения?
  • 0
    +1 за ответ; если вам не нужны все строки, вы можете попробовать std :: map <int, std :: map <int, std: string >> или что-то подобное. Если вам нужно несколько концертов данных, вы можете использовать базу данных?
0

Попытка заранее выделить столько места говорит о том, что вы принимаете неправильный подход к проблеме. Я подозреваю, что большинство узлов в двойном векторе будут пустыми. Если это так, вам будет гораздо лучше с чем-то вроде двойной карты вместо двойного вектора:

std::map< int, std::map< int, std::string > > CommunityNodes();

Затем вы создаете только записи, которые должны иметь, вместо предварительного распределения всего массива.

Обратите внимание: с помощью оператора [] оператор автоматически создаст узел, даже если вы ему ничего не назначили. Если вы не хотите создавать узел, используйте "find()" вместо "[]".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню