У меня есть несколько больших Intel TBB concurrent_vectors, которые мне нужно объединить. Они настолько велики, что выделение нового concurrent_vector адекватного размера невозможно.
…поэтому следующий псевдокод не будет работать
concurrent_vector<myStruct> A(100000);
concurrent_vector<myStruct> B(100000);
...
concurrent_vector<myStruct> X(100000);
concurrent_vector<myStruct> combined;
combined.resize(A.size()+B.size()....X.size()); // This will fail
То, что я хотел бы сделать, это перенести или поменять местами первый набор векторов, чтобы [A], [B] … [X] стало [AB … X]. Я знаю, что tbb поддерживает swap () одного вектора, но я не вижу, как поменять или добавить кратные. Может кто-то указать мне верное направление? Заранее спасибо!!
К сожалению, нет такого способа объединить несколько concurrent_vector в один без перераспределения. Он исходит из строгого правила структуры данных tbb :: concurrent_vector, где размер каждого сегмента элементов должен быть такого же размера, как сумма всех предыдущих сегментов.
Но помните, что concurrent_vector растет без перераспределения, поэтому лучшее, что вы можете сделать, это добавлять векторы один за другим, уничтожая их сразу после копирования. Таким образом, есть больше шансов, что достаточно большой блок памяти будет освобожден при необходимости.
std::copy(B.begin(), B.end(), A.grow_by(B.size())); B.clear();
std::copy(C.begin(), C.end(), A.grow_by(C.size())); C.clear();
...
std::copy(X.begin(), X.end(), A.grow_by(X.size())); // X.clear();
Однако фрагментация памяти может все испортить.
Других решений пока нет …