diff --git a/reco/detectors/trd/CbmTrdClusterFinder.cxx b/reco/detectors/trd/CbmTrdClusterFinder.cxx
index 2d239d67ca44f3160ad914006feb23aff0f2110a..d470d6825f368b2a38a02166ab9e1e91326bd316 100644
--- a/reco/detectors/trd/CbmTrdClusterFinder.cxx
+++ b/reco/detectors/trd/CbmTrdClusterFinder.cxx
@@ -79,12 +79,24 @@ Bool_t CbmTrdClusterFinder::AddCluster(CbmTrdCluster* c)
 // ---- addDigisToModules ----
 UInt_t CbmTrdClusterFinder::addDigisToModules()
 {
+  const int NDIGICHUNK = 100;  // force flush of cluster buffer once every NDIGICHUNK digi to avoid memory exhaustion
+
   UInt_t ndigis = static_cast<UInt_t>(std::abs(CbmDigiManager::Instance()->GetNofDigis(ECbmModuleId::kTrd)));
   if (ndigis == 0) return 0;
-  for (size_t idigi = 0; idigi < ndigis; idigi++) {
+
+  int jdigi(0);
+  for (size_t idigi(0); idigi < ndigis; idigi++) {
     addDigiToModule(idigi);
+    // once in a while dump finished clusters
+    // TODO ad hoc condition. Maybe a find a better one
+    if (jdigi >= NDIGICHUNK) {
+      processDigisInModules(jdigi, nullptr, false);
+      jdigi = 0;
+    }
+    else
+      jdigi++;
   }
-  return ndigis;
+  return jdigi;
 }
 
 // ---- addDigisToModules ----
@@ -118,14 +130,16 @@ void CbmTrdClusterFinder::addDigiToModule(UInt_t digiIdx)
 }
 
 // ---- processDigisInModules ----
-void CbmTrdClusterFinder::processDigisInModules(UInt_t ndigis, CbmEvent* event)
+void CbmTrdClusterFinder::processDigisInModules(UInt_t ndigis, CbmEvent* event, bool clr)
 {
+  // printf("AB :: processDigisInModules(%d, %p) clr[%c]\n", ndigis, (void*) event, (clr?'Y':'N'));
+
   CbmTrdModuleRec* mod(NULL);
   Int_t digiCounter(0), clsCounter(0);
   for (std::map<Int_t, CbmTrdModuleRec*>::iterator imod = fModules.begin(); imod != fModules.end(); imod++) {
     mod = imod->second;
     digiCounter += mod->GetOverThreshold();
-    clsCounter += mod->FindClusters();
+    clsCounter += mod->FindClusters(event || clr);
     AddClusters(mod->GetClusters(), event, kTRUE);
   }
 
diff --git a/reco/detectors/trd/CbmTrdClusterFinder.h b/reco/detectors/trd/CbmTrdClusterFinder.h
index 99a48d1ee8818034d4b5a55b7c3a1fcb997f9f14..c01df96f91713d4df47027d71da06c79a13c084f 100644
--- a/reco/detectors/trd/CbmTrdClusterFinder.h
+++ b/reco/detectors/trd/CbmTrdClusterFinder.h
@@ -187,10 +187,11 @@ private:
   /**
    * @brief Call the clusterizer function of each module
    * 
-   * @param ndigis 
-   * @param event 
+   * @param ndigis total number of digis processed
+   * @param event link to digi event in case event-by-event reco is activated
+   * @param clr force clear clusters buffers
    */
-  void processDigisInModules(UInt_t ndigis, CbmEvent* event = nullptr);
+  void processDigisInModules(UInt_t ndigis, CbmEvent* event = nullptr, bool clr = true);
 
   /**
    * @brief Adds the module corresponding to the address of the passed digi to the ModuleMap (fModules)
diff --git a/reco/detectors/trd/CbmTrdModuleRec.h b/reco/detectors/trd/CbmTrdModuleRec.h
index 93dbc1c2e81432041fedd476e3ebab1c513907cb..bace9c2a79c6226346bcc52c1a8fcb5eff5448bc 100644
--- a/reco/detectors/trd/CbmTrdModuleRec.h
+++ b/reco/detectors/trd/CbmTrdModuleRec.h
@@ -45,7 +45,7 @@ public:
   /**
    * \brief Steering routine for finding digits clusters
    **/
-  virtual Int_t FindClusters() = 0;
+  virtual Int_t FindClusters(bool clr = true) = 0;
   virtual Int_t GetOverThreshold() const { return 0; }
   virtual TClonesArray* GetClusters() { return fClusters; }
   virtual const TClonesArray* GetClusters() const { return fClusters; }