From cc36e108c244ce252b30e0903dcbcbd82a04e691 Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Fri, 22 May 2026 23:50:17 +0200 Subject: [PATCH] Provide an upper limit for the size of the tables Avoid reallocation. The fact that a large buffer is reserved should not matter for PSS, since untouched entries get mapped to the zero page. --- PWGDQ/Tasks/tableReader_withAssoc.cxx | 32 +++++++++++++++------------ 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 40450cdb4a8..985eab4bcc4 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -1794,19 +1794,23 @@ struct AnalysisSameEventPairing { uint32_t dileptonMcDecision = static_cast(0); // placeholder, copy of the dqEfficiency.cxx one int sign1 = 0; int sign2 = 0; - dielectronList.reserve(1); - dimuonList.reserve(1); - dielectronsExtraList.reserve(1); - dielectronInfoList.reserve(1); - dimuonsExtraList.reserve(1); - dileptonInfoList.reserve(1); - dileptonFlowList.reserve(1); + // Reserve capacity for the output tables to avoid repeated reallocations + // inside the Arrow builders. Unused capacity is virtual address space + // only — pages are not faulted in until written. + auto nAssocs = assocs.size(); + dielectronList.reserve(nAssocs); + dimuonList.reserve(nAssocs); + dielectronsExtraList.reserve(nAssocs); + dielectronInfoList.reserve(nAssocs); + dimuonsExtraList.reserve(nAssocs); + dileptonInfoList.reserve(nAssocs); + dileptonFlowList.reserve(nAssocs); if (fConfigOptions.flatTables.value) { - dielectronAllList.reserve(1); - dimuonAllList.reserve(1); + dielectronAllList.reserve(nAssocs); + dimuonAllList.reserve(nAssocs); } if (fConfigOptions.polarTables.value) { - dileptonPolarList.reserve(1); + dileptonPolarList.reserve(nAssocs); } fAmbiguousPairs.clear(); constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::ReducedEventQvector) > 0); @@ -2388,7 +2392,7 @@ struct AnalysisSameEventPairing { const auto& histNames = fTrackMuonHistNames; int nPairCuts = (fPairCuts.size() > 0) ? fPairCuts.size() : 1; - electronmuonList.reserve(1); + electronmuonList.reserve(assocs1.size()); uint32_t twoTrackFilter = 0; int sign1 = 0; @@ -3085,7 +3089,7 @@ struct AnalysisAsymmetricPairing { // Template function to run same event pairing with asymmetric pairs (e.g. kaon-pion) template - void runAsymmetricPairing(TEvents const& events, Preslice& preslice, TTrackAssocs const& /*assocs*/, TTracks const& /*tracks*/) + void runAsymmetricPairing(TEvents const& events, Preslice& preslice, TTrackAssocs const& assocs, TTracks const& /*tracks*/) { fPairCount.clear(); @@ -3098,8 +3102,8 @@ struct AnalysisAsymmetricPairing { int sign1 = 0; int sign2 = 0; - ditrackList.reserve(1); - ditrackExtraList.reserve(1); + ditrackList.reserve(assocs.size()); + ditrackExtraList.reserve(assocs.size()); constexpr bool trackHasCov = ((TTrackFillMap & VarManager::ObjTypes::TrackCov) > 0 || (TTrackFillMap & VarManager::ObjTypes::ReducedTrackBarrelCov) > 0);