@@ -9,23 +9,34 @@ namespace NKikimr::NOlap {
99
1010bool TGeneralSerializedSlice::GroupBlobsImpl (const NSplitter::TGroupFeatures& features, std::vector<TSplittedBlob>& blobs) {
1111 AFL_VERIFY (features.GetSplitSettings ().GetMaxBlobSize () >= 2 * features.GetSplitSettings ().GetMinBlobSize ())(
12- " event" , " we need be sure that 2 * small < big" );
13- std::sort (Data.begin (), Data.end ());
14- THashMap<ui32, TSplittedEntity::TNormalizedBlobChunks> chunksPreparation;
12+ " event" , " we need be sure that 2 * small < big" );
13+ const auto pred = [](const TSplittedEntity* l, const TSplittedEntity* r) {
14+ return r->GetSize () < l->GetSize ();
15+ };
16+ std::vector<TSplittedEntity*> dataPtr;
1517 for (auto && i : Data) {
1618 if (!features.Contains (i.GetEntityId ())) {
1719 continue ;
1820 }
21+ dataPtr.emplace_back (&i);
22+ }
23+ std::sort (dataPtr.begin (), dataPtr.end (), pred);
24+ ui32 count = 0 ;
25+ THashMap<ui32, TSplittedEntity::TNormalizedBlobChunks> chunksPreparation;
26+ for (auto && i : dataPtr) {
27+ count += i->GetChunks ().size () * 2 ;
1928 TSplittedEntity::TNormalizedBlobChunks normalizedChunks (features.GetSplitSettings ().GetMinBlobSize (),
2029 features.GetSplitSettings ().GetMaxBlobSize (), features.GetSplitSettings ().GetBlobSizeTolerance (), Schema, Counters, InternalSplitsCount);
21- auto chunksInit = i.BuildBlobChunks (features.GetSplitSettings ().GetMaxBlobSize (), Schema, Counters, InternalSplitsCount);
30+ normalizedChunks.Reserve (i->GetChunks ().size () * 2 );
31+ auto chunksInit = i->BuildBlobChunks (features.GetSplitSettings ().GetMaxBlobSize (), Schema, Counters, InternalSplitsCount);
2232 for (auto && c : chunksInit) {
2333 normalizedChunks.AddChunk (std::move (c));
2434 }
25- chunksPreparation.emplace (i. GetEntityId (), normalizedChunks.Normalize ());
35+ chunksPreparation.emplace (i-> GetEntityId (), normalizedChunks.Normalize ());
2636 }
2737 TSplittedEntity::TNormalizedBlobChunks result (features.GetSplitSettings ().GetMinBlobSize (), features.GetSplitSettings ().GetMaxBlobSize (),
2838 features.GetSplitSettings ().GetBlobSizeTolerance (), Schema, Counters, InternalSplitsCount);
39+ result.Reserve (count);
2940 for (auto && i : chunksPreparation) {
3041 result.Merge (std::move (i.second ));
3142 }
0 commit comments