Конкатенация ТББ concurrent_vectors?

У меня есть несколько больших 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 () одного вектора, но я не вижу, как поменять или добавить кратные. Может кто-то указать мне верное направление? Заранее спасибо!!

2

Решение

К сожалению, нет такого способа объединить несколько 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();

Однако фрагментация памяти может все испортить.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector