root文件hadd合并大于100Gb的文件报错的解决办法

root文件hadd合并大于100Gb的文件报错的解决办法

问题描述

采用root的hadd合并>100Gb的文件,出现以下错误

Fill: Switching to new file: ./wjets_1.root
Fatal in <TFileMerger::RecursiveRemove>: Output file of the TFile Merger (targeting ./wjets.root) has been deleted (likely due to a TTree larger than 100Gb)
aborting
#0  0x00000037718ac68e in __libc_waitpid (pid=<value optimized out>, stat_loc=0x7fffffff82ac, options=0) at ../sysdeps/unix/sysv/linux/waitpid.c:32
#1  0x000000377183e609 in do_system (line=<value optimized out>) at ../sysdeps/posix/system.c:149
#2  0x00002aaaacedbc5a in TUnixSystem::StackTrace() () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libCore.so
#3  0x00002aaaace4bffa in DefaultErrorHandler(int, bool, char const*, char const*) () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libCore.so
#4  0x00002aaaace4ba72 in ErrorHandler () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libCore.so
#5  0x00002aaaace31754 in TObject::Fatal(char const*, char const*, ...) const () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libCore.so
#6  0x00002aaaace57be3 in THashList::RecursiveRemove(TObject*) () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libCore.so
#7  0x00002aaaace30e8a in TObject::~TObject() () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libCore.so
#8  0x00002aaaac4307f9 in TFile::~TFile () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libRIO.so
#9  0x00002aaaab08ab8f in TTree::ChangeFile(TFile*) () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libTree.so
#10 0x00002aaaab091502 in TTree::CopyEntries(TTree*, long long, char const*) () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libTree.so
#11 0x00002aaaab090b4d in TTree::Merge(TCollection*, TFileMergeInfo*) () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libTree.so
#12 0x00002aaaac45d6f5 in TFileMerger::MergeRecursive(TDirectory*, TList*, int) () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libRIO.so
#13 0x00002aaaac45c47a in TFileMerger::PartialMerge(int) () from /cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase/x86_64/root/6.04.14-x86_64-slc6-gcc49-opt/lib/libRIO.so
#14 0x00000000004020b5 in main ()
Aborted

参考解决方法 https://root-forum.cern.ch/t/root-6-04-14-hadd-100gb-and-rootlogon/24581

无效

解决办法

采用TChain将多个root文件链接,然后作处理;这样做有两个优点,一,不需要费时采用hadd作合并,二,直接写个mac作处理,方便省时。

// 利用chain链接多个root文件,然后进行处理,请参考tutorials/run_h1analysis.C  h1analysis.C h1analysis.h

void cchain()
{
  //初始参数
  TString TreeName = "Det"; //这里是你要处理的root文件中tree name
  TChain *chain = new TChain(TreeName);

  std::cout << "Creating the chain" << std::endl;
  chain->SetCacheSize(20*1024*1024);
  TString dir=gSystem->DirName(__FILE__); //获取当前文件路径
  dir.ReplaceAll("/./","/");
  // std::cout<<dir<<std::endl;
  gSystem->Setenv("Dir",dir);//当前文件路径,填绝对路径或相对路径
  chain->Add("$Dir/*.root");//链接需要处理的root文件; 注意,root文件的tree名相同
  
  chain->LoadTree(-1);
  //调用Process数据分析
  //chain->Process("$Dir/EorM33.C");
  }

注意

需将Process中的.C文件,即上文中的EorM33.C文件中的SetEntry()改为SetLocalEntry()。

改为
SetEntry(entry)
SetLocalEntry(entry)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值