@@ -208,7 +208,21 @@ ROOT::RColumnDescriptor ROOT::RColumnDescriptor::Clone() const
208208ROOT::RClusterDescriptor::RPageInfoExtended
209209ROOT::RClusterDescriptor::RPageRange::Find (ROOT::NTupleSize_t idxInCluster) const
210210{
211- const auto N = fCumulativeNElements .size ();
211+ if (!fCumulativeNElements ) {
212+ // Small range, just iterate through fPageInfos
213+ NTupleSize_t pageNumber = 0 ;
214+ NTupleSize_t firstInPage = 0 ;
215+ for (const auto &pi : fPageInfos ) {
216+ if (firstInPage + pi.GetNElements () > idxInCluster) {
217+ return RPageInfoExtended{pi, firstInPage, pageNumber};
218+ }
219+ pageNumber++;
220+ firstInPage += pi.GetNElements ();
221+ }
222+ R__ASSERT (false );
223+ }
224+
225+ const auto N = fCumulativeNElements ->size ();
212226 R__ASSERT (N > 0 );
213227 R__ASSERT (N == fPageInfos .size ());
214228
@@ -217,20 +231,20 @@ ROOT::RClusterDescriptor::RPageRange::Find(ROOT::NTupleSize_t idxInCluster) cons
217231 std::size_t midpoint = N;
218232 while (left <= right) {
219233 midpoint = (left + right) / 2 ;
220- if (fCumulativeNElements [midpoint] <= idxInCluster) {
234+ if ((* fCumulativeNElements ) [midpoint] <= idxInCluster) {
221235 left = midpoint + 1 ;
222236 continue ;
223237 }
224238
225- if ((midpoint == 0 ) || (fCumulativeNElements [midpoint - 1 ] <= idxInCluster))
239+ if ((midpoint == 0 ) || ((* fCumulativeNElements ) [midpoint - 1 ] <= idxInCluster))
226240 break ;
227241
228242 right = midpoint - 1 ;
229243 }
230244 R__ASSERT (midpoint < N);
231245
232246 auto pageInfo = fPageInfos [midpoint];
233- decltype (idxInCluster) firstInPage = (midpoint == 0 ) ? 0 : fCumulativeNElements [midpoint - 1 ];
247+ decltype (idxInCluster) firstInPage = (midpoint == 0 ) ? 0 : (* fCumulativeNElements ) [midpoint - 1 ];
234248 R__ASSERT (firstInPage <= idxInCluster);
235249 R__ASSERT ((firstInPage + pageInfo.GetNElements ()) > idxInCluster);
236250 return RPageInfoExtended{pageInfo, firstInPage, midpoint};
@@ -975,12 +989,16 @@ ROOT::RResult<ROOT::RClusterDescriptor> ROOT::Internal::RClusterDescriptorBuilde
975989 if (fCluster .fColumnRanges .count (pr.first ) == 0 ) {
976990 return R__FAIL (" missing column range" );
977991 }
978- pr.second .fCumulativeNElements .clear ();
979- pr.second .fCumulativeNElements .reserve (pr.second .fPageInfos .size ());
980- ROOT::NTupleSize_t sum = 0 ;
981- for (const auto &pi : pr.second .fPageInfos ) {
982- sum += pi.GetNElements ();
983- pr.second .fCumulativeNElements .emplace_back (sum);
992+ pr.second .fCumulativeNElements .reset ();
993+ const auto nPages = pr.second .fPageInfos .size ();
994+ if (nPages > RClusterDescriptor::RPageRange::kLargeRangeThreshold ) {
995+ pr.second .fCumulativeNElements = std::make_unique<std::vector<NTupleSize_t>>();
996+ pr.second .fCumulativeNElements ->reserve (nPages);
997+ ROOT::NTupleSize_t sum = 0 ;
998+ for (const auto &pi : pr.second .fPageInfos ) {
999+ sum += pi.GetNElements ();
1000+ pr.second .fCumulativeNElements ->emplace_back (sum);
1001+ }
9841002 }
9851003 }
9861004 RClusterDescriptor result;
0 commit comments