Hi Michael,
This clearly indicates that some objects allocated by your Event class
are not deleted.
The result of gObjectTable->Print below shows that you did not activate
the memory statistics collection. By default, Root runs with no memory
run statistics. To activate this collection, do the following:
If you have a file named ".rootrc" in your current directory, add the following
2 lines:
Root.MemStat: 1
Root.ObjectStat: 1
If you do not have this file in your directory, edit $ROOTSYS/system.rootrc
changing these values from 0 to 1.
To tell more about the problem, I need your Event.h and Event.cxx files
and also all the classes referenced by this class.
Let me know.
Rene Brun
Michael Kuss wrote:
>
> Hi Rooters,
>
> I write a program which reads events, extracts selected branches, and
> writes the truncated events back to another file. The program is more or
> less cloned from the copytree2.C example macro at
> http://root.cern.ch/root/html/examples/copytree2.C.html .
>
> It works, except that it acts as a memory hog, i.e. grows bigger and
> bigger during execution. The following is an excerpt, the full code is in
> the attachment.
>
> >>>>>>>>>>>>
>
> Int_t maxVirtualSize = 8000000;
>
> TROOT rootSys ( "GLAST", "GLAST Event" );
> TFile* f = new TFile ( file, "read" );
> TTree* T = (TTree*)f->Get("T");
> T->SetMaxVirtualSize(maxVirtualSize);
> Event* event = new Event();
> T->SetBranchAddress ( "Event", &event );
> T->SetBranchStatus ( "*", 0 );
> T->SetBranchStatus ( "m_event", 1 );
> T->SetBranchStatus ( "m_TKR", 1 );
>
> TFile* of = new TFile ( outFile, "recreate", "stripped test beam file" );
> TTree* oT = T->CloneTree(0);
> oT->Reset();
> oT->SetMaxVirtualSize(maxVirtualSize);
> oT->SetAutoSave(maxVirtualSize);
> oT->GetBranch("m_event")->SetFile(outFile);
> oT->GetBranch("m_TKR")->SetFile(outFile);
> gObjectTable->Print();
> oT->CopyEntries( T, nEvent );
> gObjectTable->Print();
>
> of->Write();
>
> delete of;
> delete f;
> <<<<<<<<<<<<
>
> I don't see the memory leak. The memory is being allocated during
> oT->CopyEntries(), and released on program termination. The
> gObjectTable->Print() statements enclosing oT->CopyEntries() give
> identical output before and after.
>
> >>>>>>>>>>>>
> Object statistics
> class cnt on heap size total size heap size
> ============================================================================
> TObject 42 42 12 504 504
> TOrdCollection 5 5 44 220 220
> TEnv 1 1 24 24 24
> THashTable 2 2 40 80 80
> TClassTable 1 1 12 12 12
> TObjectTable 1 1 24 24 24
> TROOT 1 0 256 256 0
> THashList 2 2 48 96 96
> TUnixSystem 1 1 320 320 320
> ----------------------------------------------------------------------------
> Total: 56 55 780 1536 1280
> ============================================================================
> <<<<<<<<<<<<
>
> Looking into the TTree.cxx sources also didn't reveal something
> suspicious.
>
> I assumed that oT->SetMaxVirtualSize() is limiting the amount of memory
> used, but this does not seem to be the case. WHAT AM I MISSING?
>
> Thanks,
>
> Michael
>
> --------------------------------------------------------------------------------
>
> Name: stripEvent.cc
> stripEvent.cc Type: Plain Text (TEXT/PLAIN)
> Encoding: BASE64
> Description: stripEvent.cc
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:37 MET