Memory statistics in a ROOT based program

From: Axel Schwank (schwank@mail.desy.de)
Date: Fri Mar 13 1998 - 12:41:38 MET


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