问题描述
采用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()。