How to clean/delete properly RooDataSet in PyROOT?

What is the correct/recommended way to clean/delete RooDataSet in PyROOT ?

I have a use case where relatively large dataset is created and used inside the loop. and I see that memory is not free after the loop.


import ROOT, os, psutil, random 

# inner psutil function
def process_memory():
    process = psutil.Process(os.getpid())
    mem_info = process.memory_info()
    return mem_info.rss

evt     = ROOT.RooRealVar ( 'Evt'    , '#event'        , 0 , 1000000 )
run     = ROOT.RooRealVar ( 'Run'    , '#run'          , 0 , 1000000 )
mass    = ROOT.RooRealVar ( 'Mass'   , 'mass-variable' , 0 , 100     )

varset  = ROOT.RooArgSet  ( evt , run , mass )
dataset = ROOT.RooDataSet ( "dataset", 'Test Data set-0' , varset )  

before_create = process_memory ()
print ( 'MEMORY BEFORE CREATION OF DATASET %.1fMB' % ( before_create / 2**20 ) ) 

NR = 1000
NE = 1000

for r in range ( NR ) :
    run.setVal ( r )
    for e in range ( NE ) :        
        evt .setVal   ( e )        
        mass.setVal   ( random.uniform      ( 0  , 10  ) )
        dataset.add ( varset )

before_loop = process_memory ()
print ( 'DELTA MEMORY (BEFORE LOOP) %.2fMB' % ( ( before_loop - before_create ) / 2**20  ) ) 

NL = 100 
for i in range ( NL ) :

    ## some actinon to create another large dataset, e,g, resuction
    ## in my concreete case I create the boostrapped-dataset 
    another = dataset.reduce ( "Mass<100" ) 

    ## (1) 
    ## del another       ## No effect at all 

    ## (2) 
    ## another.Delete()  ## it works, but looks a bit brutal 

    ## (3)   -- no effect 
    ## store = another.store()
    ## if store :
    ##    store.reset        ()
    ##    store.resetBuffers ()
    ##    store.resetCache   ()        
    ## another.resetBuffers   ()
    ## another.reset          ()
     
    
after_loop = process_memory ()
print ( 'DELTA MEMORY (AFTER  LOOP) %.2fMB' % ( ( after_loop - before_loop ) / 2**20  ) )
    

 
  • simple delete another inside the loop has no effece
  • `another.Delete()` does work but cout it be a recomemnded way?
  • manual reset of store and dataset does report that another has no events enynmore, but memory is not free.