Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyROOT中的大量内存使用_Python_Memory_Root Framework_Pyroot - Fatal编程技术网

Python pyROOT中的大量内存使用

Python pyROOT中的大量内存使用,python,memory,root-framework,pyroot,Python,Memory,Root Framework,Pyroot,我的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

我的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是一个根文件,其中有700000个条目,每个条目有多个候选粒子

当我运行这个脚本时,它使用了大约600 MB的内存。如果我拆下这条线

h_p.Fill(p[cand])
h_E.Fill(E[cand])
它使用约400 MB

如果我也删除该行

h_p.Fill(p[cand])
h_E.Fill(E[cand])
它使用约150 MB

如果我也删除了这些行

h_nTracks.Fill(nTracks)
h_ECLEnergy.Fill(ECLEnergy)
内存使用没有进一步减少

似乎每多填一个柱状图,我就要填一张表格

h_variable.Fill(variable[cand])
(即,每个候选条目只填写一次的直方图,而不是每个条目只填写一次的直方图)我使用额外的~200 MB内存。当我有10个或更多的直方图时,这会成为一个严重的问题,因为我使用的是GBs内存,并且超出了我的计算系统的限制。有人有解决办法吗

更新:我认为这是python3的问题。

如果我在我的原始帖子(上面)中使用脚本,并使用python2运行它,那么内存使用量约为200 MB,而python3的内存使用量约为600 MB。即使我尝试使用长变量名复制问题2,python2的作业仍然只使用约200 MB的内存,而python3的内存为约1.3 GB

在我的谷歌搜索过程中,我发现了一些关于人们在使用pyROOT和python3时遇到内存泄漏的其他记录。从Python3.6.2和ROOT 6.08/06开始,这似乎仍然是一个问题,如果您想使用pyROOT,目前必须使用python2


因此,使用python2似乎是我目前的“解决方案”,但并不理想。如果有任何人有任何进一步的信息或建议,我将非常感谢您的来信

我很高兴你发现问题出在蟒蛇3上。但是,如果您(或任何人)在将来处理直方图时仍然存在内存使用问题,以下是一些可能的解决方案,我希望您会发现这些解决方案很有帮助

THnSparse
使用
THnSparse
-
THnSparse
是一种高效的多维直方图,在直方图中显示其强度,其中只有一小部分的总存储箱被填满

t树
t树
是根目录中的数据结构,这些数据结构是非常明显的表。然而,它们是高度优化的。
t树
分支
叶子
组成,它们包含可以通过根快速高效访问的数据。如果您先将数据放入
TTree
,然后将其读入柱状图,我保证您会发现内存使用率更低,运行时间更长

下面是一些示例
TTree
code

root_file_path = "../hadd_www.root"

muon_ps = ROOT.TFile(root_file_path)
muon_ps_tree = muon_ps.Get("WWWNtuple")
muon_ps_branches = muon_ps_tree.GetListOfBranches()
canv= ROOT.TCanvas()

num_of_events = 5000

ttvhist = ROOT.TH1F('Statistics2', 'Jet eta for ttV (aqua) vs WWW (white); Pseudorapidity',100, -3, 3)
i = 0

muon_ps_tree.GetEntry(i)
print len(muon_ps_tree.jet_eta)

#sys.exit()
while muon_ps_tree.GetEntry(i):
    if i > num_of_events: break
    for k in range(0,len(muon_ps_tree.jet_eta)-1):
        wwwhist.Fill(float(muon_ps_tree.jet_eta[0]), 1)
    i += 1  

ttvhist.Write()
ttvhist.Draw("hist")
ttvhist.SetFillColor(70);
这里有一个资源,您可以从中了解
TTree
s的奇妙之处:

更多阅读,这里是一个关于加速CERN帮助论坛上根组织图构建的讨论:


祝您数据分析顺利,编码愉快

我很高兴你发现问题出在蟒蛇3上。但是,如果您(或任何人)在将来处理直方图时仍然存在内存使用问题,以下是一些可能的解决方案,我希望您会发现这些解决方案很有帮助

THnSparse
使用
THnSparse
-
THnSparse
是一种高效的多维直方图,在直方图中显示其强度,其中只有一小部分的总存储箱被填满

t树
t树
是根目录中的数据结构,这些数据结构是非常明显的表。然而,它们是高度优化的。
t树
分支
叶子
组成,它们包含可以通过根快速高效访问的数据。如果您先将数据放入
TTree
,然后将其读入柱状图,我保证您会发现内存使用率更低,运行时间更长

下面是一些示例
TTree
code

root_file_path = "../hadd_www.root"

muon_ps = ROOT.TFile(root_file_path)
muon_ps_tree = muon_ps.Get("WWWNtuple")
muon_ps_branches = muon_ps_tree.GetListOfBranches()
canv= ROOT.TCanvas()

num_of_events = 5000

ttvhist = ROOT.TH1F('Statistics2', 'Jet eta for ttV (aqua) vs WWW (white); Pseudorapidity',100, -3, 3)
i = 0

muon_ps_tree.GetEntry(i)
print len(muon_ps_tree.jet_eta)

#sys.exit()
while muon_ps_tree.GetEntry(i):
    if i > num_of_events: break
    for k in range(0,len(muon_ps_tree.jet_eta)-1):
        wwwhist.Fill(float(muon_ps_tree.jet_eta[0]), 1)
    i += 1  

ttvhist.Write()
ttvhist.Draw("hist")
ttvhist.SetFillColor(70);
这里有一个资源,您可以从中了解
TTree
s的奇妙之处:

更多阅读,这里是一个关于加速CERN帮助论坛上根组织图构建的讨论:

祝您数据分析顺利,编码愉快