root
root copied to clipboard
[RF] Memory leak when using createNLL
- [x] Checked for duplicates
Describe the bug
It seems that in pyROOT, the NLL variable created from RooAbsPdf.createNLL does not get disposed of properly when the variable went out of scope, causing a memory leak.
To Reproduce
import ROOT
ROOT.RooMsgService.instance().getStream(1).removeTopic(ROOT.RooFit.Minimization)
ws = ROOT.RooWorkspace()
ws.factory("Gaussian::pdf(x[0,10],mu[4,0,10],sigma[1.0,0.1,10.0])")
pdf = ws.pdf("pdf")
x = ws.var("x")
x.setRange("SideBandLo", 0, 2)
x.setRange("SideBandHi", 6, 10)
ds = pdf.generate(ROOT.RooArgSet(x), 11000)
import psutil
def _memstat(mem0, mem1):
MB = 1024 * 1024
rss_mb = mem1.rss // MB
vms_mb = mem1.vms // MB
rss_delta_mb = (mem1.rss - mem0.rss) / MB
vms_delta_mb = (mem1.vms - mem0.vms) / MB
print(f"Memory stat: RSS={rss_mb} MB, VMS={vms_mb} MB. Delta RSS={rss_delta_mb:.2f} MB VMS={vms_delta_mb:.2f} MB")
def test(pdf, ds):
nll = pdf.createNLL(ds)
proc = psutil.Process()
mem0 = proc.memory_info()
for i in range(int(1e4)):
test(pdf, ds)
if (i%1000 == 0):
mem1 = proc.memory_info()
_memstat(mem0, mem1)
mem0 = mem1
This gives
Memory stat: RSS=4009 MB, VMS=5170 MB. Delta RSS=0.00 MB VMS=0.00 MB
Memory stat: RSS=4116 MB, VMS=5278 MB. Delta RSS=107.25 MB VMS=107.15 MB
Memory stat: RSS=4224 MB, VMS=5386 MB. Delta RSS=108.02 MB VMS=108.10 MB
Memory stat: RSS=4333 MB, VMS=5495 MB. Delta RSS=109.05 MB VMS=109.21 MB
Memory stat: RSS=4439 MB, VMS=5601 MB. Delta RSS=106.48 MB VMS=106.48 MB
Memory stat: RSS=4547 MB, VMS=5709 MB. Delta RSS=108.02 MB VMS=107.85 MB
Memory stat: RSS=4656 MB, VMS=5820 MB. Delta RSS=109.05 MB VMS=110.36 MB
Memory stat: RSS=4764 MB, VMS=5927 MB. Delta RSS=108.02 MB VMS=107.75 MB
Memory stat: RSS=4872 MB, VMS=6035 MB. Delta RSS=108.02 MB VMS=107.95 MB
Memory stat: RSS=4979 MB, VMS=6144 MB. Delta RSS=106.81 MB VMS=108.52 MB
Setup
ROOT 6.24, 6.26 (from LCG)