我的 pyROOT 分析代码正在使用大量内存。我已将问题简化为以下示例代码:
from ROOT import TChain, TH1D
# Load file, chain
chain = TChain("someChain")
inFile = "someFile.root"
chain.Add(inFile)
nentries = chain.GetEntries()
# Declare histograms
h_nTracks = TH1D("h_nTracks", "h_nTracks", 16, -0.5, 15.5)
h_E = TH1D("h_E","h_E",100,-0.1,6.0)
h_p = TH1D("h_p", "h_p", 100, -0.1, 6.0)
h_ECLEnergy = TH1D("h_ECLEnergy","h_ECLEnergy",100,-0.1,14.0)
# Loop over entries
for jentry in range(nentries):
# Load entry
entry = chain.GetEntry(jentry)
# Define variables
cands = chain.__ncandidates__
nTracks = chain.nTracks
E = chain.useCMSFrame__boE__bc
p = chain.useCMSFrame__bop__bc
ECLEnergy = chain.useCMSFrame__boECLEnergy__bc
# Fill histos
h_nTracks.Fill(nTracks)
h_ECLEnergy.Fill(ECLEnergy)
for cand in range(cands):
h_E.Fill(E[cand])
h_p.Fill(p[cand])
其中 someFile.root 是一个根文件,有 700,000 个条目,每个条目有多个候选粒子。
当我运行这个脚本时,它使用了大约 600 MB 的内存。如果我删除线
h_p.Fill(p[cand])
它使用约 400 MB。
如果我也删除该行
h_E.Fill(E[cand])
它使用约 150 MB。
如果我也删除这些行
h_nTracks.Fill(nTracks)
h_ECLEnergy.Fill(ECLEnergy)
内存使用量没有进一步减少。
似乎对于我填写表格的每个额外直方图
h_variable.Fill(variable[cand])
(即每个条目每个候选人填充一次的直方图,而不是每个条目只填充一次的直方图)我使用了额外的~200 MB 内存。当我有 10 个或更多直方图时,这将成为一个严重的问题,因为我使用的是 GB 的内存并且超出了我的计算系统的限制。有人有解决方案吗?
更新:我认为这是一个 python3 问题。
如果我在原始帖子(上图)中使用脚本并使用 python2 运行它,则内存使用量约为 200 MB,而使用 python3 则约为 600 MB。即使我尝试通过使用长变量名来复制问题 2,该作业仍然只使用 python2 的 ~200 MB 内存,而 python3 使用 ~1.3 GB 的内存。
在我的谷歌搜索过程中,我遇到了一些其他人在将 pyROOT 与 python3 一起使用时遇到内存泄漏的情况。从 Python 3.6.2 和 ROOT 6.08/06 开始,这似乎仍然是一个问题,目前如果你想使用 pyROOT,你必须使用 python2。
因此,目前使用 python2 似乎是我的“解决方案”,但这并不理想。如果有人有任何进一步的信息或建议,我将不胜感激!