2

내가 결합해야하는 여러 개의 대형 Intel TBB concurrent_vectors가 있습니다. 그것들은 너무 커서 적절한 크기의 새로운 concurrent_vector를 할당 할 수 없습니다.concatenate tbb concurrent_vectors?

... 그래서 다음 의사 코드가 작동하지 않습니다

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()을 지원한다는 것을 알고 있지만 배수를 바꾸거나 배수하는 방법을 알 수 없습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까? 미리 감사드립니다 !!

답변

4

불행히도, 재 할당없이 하나의 하나로 여러 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(); 

메모리 조각화는 모든 것을 다시 망칠 수 있습니다.