2012-01-21 3 views
-1

Я читал в других ответах, что theres без ограничений, наложенных компилятором C++ maximum size of std::vector. Я пытаюсь использовать вектор для одной цели и должен иметь 10^19 элементов.stl "vector <T> too long"

typedef struct{ 
    unsigned long price, weight; 
}product; 


//inside main 
unsigned long long n = 930033404565174954; 
vector<product> psorted(n); 

Программа разрывается на последнее утверждение. если я пытаюсь resize(n) вместо инициализации с n затем также программ порывает с сообщением:

vector<T> too long 
std::length_error at memory location 

мне нужно сортировать данные accourding к цене после ввода в векторе. что мне делать ?

+8

Почему мы используем 'typedef struct' в C++? Возможно, у кого-то есть много неузнаваемости? :-) –

+4

930033404565174954 намного больше 10^9. –

+1

Проверьте 'sizeof (std :: vector :: size_type)'. Это говорит о максимальном размере. –

ответ

11

std::vectorУ есть ограничения на количество материала, которое он может нести. Вы можете запросить его с помощью std::vector::max_size, который возвращает максимальный размер, который вы можете использовать.

10^19 единиц.

У вас есть 10^19 * sizeof(product) memory? Я предполагаю, что у вас нет ~ 138 Exa байт ОЗУ. Кроме того, вам нужно будет компилировать в 64-битном режиме, чтобы даже рассмотреть возможность выделения этого. Компилятор не разбивается; ваше исполнение ломается, пытаясь выделить слишком много материала.

+0

как я должен сортировать данные тогда? – Pheonix

+2

@Pheonix: Если вы спрашиваете о том, как сортировать эти данные, вы должны объяснить, откуда вы его получаете, поскольку у вас явно больше данных, чем у RAM. Заголовок вашего вопроса вводит в заблуждение. –

+0

идентификатор mapreduce в hadoop сделал бы это. Даже на одной коробке это будет как можно больше параллелизировать сортировку, что потенциально сделает сортировку быстрее. –

6

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

Тем не менее, 10^19 8-байтных предметов - 80 миллионов TB. Я не уверен, что у кого-то есть такой большой диск ...

Кроме того, при условии щедрой пропускной способности диска 300 Мбайт/с, это займет 8000 лет, чтобы написать!