Re: Memory statistics in a ROOT based program

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Mar 13 1998 - 13:22:17 MET


Axel,
First of all, change your buffer size from 640 bytes to a value
in the range of 8000,16000.
If you do not have an inflation of objects, the only thing
that I can suspect is that you are allocating arrays
of basic types somewhere in your classes and you never delete
these arrays.
To get an idea, I suggest you monitor what is the average leak
per event. With this number, you should be able to figure out
where this leak is created.

Rene Brun

Axel Schwank wrote:
> 
> Dear ROOTers,
> I am looking for a way to trace the memory usage of my ROOT based program.
> It basically uses our own Event structure (class TH1Event) and a ROOT Tree
> consisting of a few brances that are built from data banks.
> The memory usage of this program becomes rather big (top or ps say 58 Mb
> approx.). Therefore I want to know where this memory goes.
> The executable is (with debugging information) 900 kb, the shared library
> for the local bank structures / Event Class 4.5 Mb, and the used ROOT
> libraries don't sum up to more than 6-8 Mb, I guess.
> I enriched the program's main loop with some statement that dump some
> memory information:
> gObjectTable->Print() gives the list of objects, the total sum of sizes
> grows only very slightly during execution and remains at approx. 260 kb.
> For more information about the real memory usage I wanted to use
> TStorage::PrintStatistics(), but it generates no output.
> Memory checking should be enabled normally, I nevertheless stated
> TStorage::EnableStatistics(), still the Print function keeps quiet.
> How can I learn more about who swallows my memory ?
> I use the new ROOT v2.0 (congratulations!) under IRIX 6.2
> 
> Thanks, Axel
> 
> ********************************
> 
> Axel Schwank
> 
> DESY H1-F22
> Notkestrasse 85
> D-22607 Hamburg
> 
> Rm. 1b/269
> Tel (+49 40) 8998-3560
> Fax (+49 40) 8998-4385
> 
> e-mail  schwank@mail.desy.de
> Quix    0165-6-2705109
> 
> ********************************
> 
>     ---------------------------------------------------------------
> #include <stdlib.h>
> #include <iostream.h>
> 
> //  ROOT classes
> #include <TROOT.h>
> #include <TFile.h>
> #include <TTree.h>
> #include <TBranch.h>
> #include <TStorage.h>
> #include <TObjectTable.h>
> #include <TEnv.h>
> 
> //  H1 classes
> #include "TH1Event.h"
> #include "TOutput.h"
> 
> #include "minicf.h"
> 
> //  BOS
> #include "cxx_bos.h"
> #include "cxx_mdb.h"
> #include "cxx_fpack.h"
> #include "c_bcs.h"
> #include "c_bosmdl.h"
> 
> Int_t cosmic(TH1Event*);
> 
> TH1Event* gEvent;
> TOutput* gOutput;
> TObjectTable* gObjectTable;
> 
> TROOT Cosmic("cosmic","Selection of events with cosmics");
> 
> int main(int argc, char **argv){
> 
> gROOT->SetBatch(kTRUE);
> gROOT->SetStyle("Plain");
> 
> //------Set the rootfilename and number of events to process
> 
> const TString rootfilepath = TString("/h1wgs/curacao/x01/usr/schwank/root/");
> TString rootfilename = TString("Event.root");
> Int_t Nevents = 1000000;
> if (argc>1) rootfilename = argv[1];
> if (argc>2) Nevents = atoi(argv[2]);
> TString rootfile = rootfilepath + rootfilename;
> 
> Int_t eventno=0;
> 
> //-----Init BOS
> 
> const int  nbnam=2000;
> int iret = 0,ierr = 0;
> c_bnames(nbnam);
> c_bos(Bcs.iw,NBOSIW);
> c_fparmr(5);
> c_breadc();
> 
> //-----Init H1Event structure
> 
> gEnv->Print();
> TStorage::EnableStatistics();
> gEvent = new TH1Event(1);
> gOutput= new TOutput(1);
> init_special_messages(gOutput);
> 
> //-----open output file
> 
> TFile *hfile = new TFile(rootfile,"RECREATE","Cosmic data");
> hfile->SetCompressionLevel(3);
> TTree *tree = new TTree("T","Required banks for cosmic analysis",2000000);
> tree->SetAutoSave(20000000); // autosave when 20 Mbyte written
> Int_t bufsize = 640;
> Int_t split   = 1;
> 
> //-----Create the branches, each required bank builds one branch
> 
> tree->Branch("DTRA",&gEvent->fDtra,bufsize,split);
> tree->Branch("DTNV",&gEvent->fDtnv,bufsize,split);
> tree->Branch("DCOS",&gEvent->fDcos,bufsize,split);
> tree->Branch("DMUO",&gEvent->fDmuo,bufsize,split);
> tree->Branch("DTIO",&gEvent->fDtio,bufsize,split);
> tree->Branch("DVER",&gEvent->fDver,bufsize,split);
> tree->Branch("DMIS",&gEvent->fDmis,bufsize,split);
> 
> // gObjectTable->Print();
> TStorage::PrintStatistics();
> 
> //-----Main loop
> 
> while (eventno<Nevents){
> 
>   c_fseqr("BOSINPUT",&iret);
>   if(iret < 0) break;
> 
>   gEvent->FillDtra();
>   gEvent->FillDtnv();
>   gEvent->FillDcos();
>   gEvent->FillDmuo();
>   gEvent->FillDtio();
>   gEvent->FillDver();
>   gEvent->FillDmis();
> 
>   if (cosmic(gEvent)<1) {gEvent->Clear(); continue;}
>   ++eventno;
>   cout << "Event Number " << eventno << " : Run= "
>     << Bosmdl.nccrun << " Event= " << Bosmdl.nevent <<endl;
> 
>   if (eventno%10==0) {
>     gObjectTable->Print();
>     TStorage::PrintStatistics();
>   }
> 
>   //---Fill required banks in the tree
> 
>   tree->Fill();
> //  c_fpcurx("BOSINPUT","IDXCRE",&ierr);
>   gEvent->Clear();
> }
> 
> hfile->Write();
> 
> //-----close files
> 
> hfile->Close();
> c_fparm("CLOSE ALL");
> 
> return 0;
> }



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:34:31 MET