Пытаясь справиться с огромными наборами данных, я использовал удобный STXXL библиотека. Хотя я столкнулся с небольшой проблемой при попытке использовать / сгенерировать многомерный вектор.
Следующая программа на некоторое время замораживает систему, а затем ее убивают. Нет вывода в командной строке:
typedef stxxl::vector<int> vector;
typedef stxxl::vector<vector> vector_2d;
typedef stxxl::vector<vector_2d> vector_3d;
vector_3d numbers(5);
for (auto & rc : numbers){
rc = vector_2d(5);
for (auto & r : rc ){
r = vector(5);
std::generate(r.begin(), r.end(), custom_random);
}
}
for (auto rc : numbers){
for(auto r : rc){
for(auto n : r){
std::cout << n << " ";
}
std::cout << std::endl;
}
std::cout << "-----" << std::endl;
}
Проходя через программу с помощью отладчика, выявляется, что зависание происходит в следующей строке:
vector_3d numbers(5);
Я использую версию 1.3.1 STXXL и компилирую ее в Linux с помощью GCC 4.8.1. Я не уверен, что мне здесь не хватает. Смена вектора на версию STD, заставляет его работать. Это также работает, если уменьшить до 2D вектора.
редактировать:
Также пробовал последнюю стабильную версию STXXL (v 1.4.0), но безрезультатно. Та же проблема возникает.
Согласно разделу «Параметризация контейнеров STXXL» STXXL FAQs stxxl::vector<stxxl::vector<T> >
недопустимая конструкция
Контейнеры STXXL могут содержать только типы POD.
Я столкнулся с этой проблемой, и вкратце я должен сказать, что вы должны изменить свой взгляд на stxxl, тогда вы можете программировать все, что захотите, в этом случае вы можете сделать что-то вроде:
typedef stxxl::vector<std::vector<std::vector<int>>> vector_3d;
vector_3d numbers(5);
vector<vector<int>> a;
vector<int> b;
b.push_back(1);
b.push_back(3);
a.push_back(b);
numbers.push_back(a);
вы должны знать, что единственная цель stxxl — это управление «очень большой памятью», поэтому вы должны писать свой код так, чтобы stxxl мог управлять им, когда он очень большой.