Re: Updating root files

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed Nov 10 1999 - 18:20:10 MET


Hello Mariusz,

Mariusz Stanczak wrote:
> 
> Hello All,                                                              [Root 2.23/8 on WinNT 4sp5]
> 
>    I have a root file with 25K+ trees, each with 1K+ branches with 6 leaves
> of simple data types (int, float).  It's not a very typical (as I understand
> it) root file in that each branch is completely separate from others
> (created with branch->Fill() as opposed to tree->Fill() which, BTW resulted
> in a 1/3 the file size in half the time).  I have a few questions concerning
> this file;

This is clearly not a typical application !
It can give some ideas to some people. I know several applications
generating a separate Tree per event/collision. Root has in principle
no limits on the number of objects in one file (if the total file
remains
below 2 GBytes).


> - when updating the file I do:
>                         TTree *tree = (TTree *)f_root->Get(temp_t);
>                         if (!tree)
>                                 tree = new TTree(temp_t, "");
> 
> //                      branch = tree->GetBranch(temp_s);
> //                      if (branch)
> //                              delete branch;
> 
>                         branch = tree->Branch(temp_s, &data,
>                                         "t/i:of/F:hf/F:lf/F:cf/F:v/i", 4800);
>                         branch->Fill();
>                         tree->Write(NULL, TObject::kOverwrite);
>                         delete tree;
> 
> which despite the overwrite parameter will still add a branch (instead of
> replacing it) if a branch with a given name already exists.  What should I
> do to force replacing an existing branch?  As you can see, I tried to delete
> it before creating a new version of it, but that raises an exception.
> 

Currently you can only add branches (your code above is correct).
I do not support deleting existing branches.

> - The IsSortable returns TRUE yet new/updated trees are added to the end of
> the tree.  How to keep trees, branches sorted (by name)?
> 

This is currently not implemented. Not too difficult to add.

> - On a root file with this many trees doing f->Get() is very time consuming.
> Is there a faster way?  The update data is sorted (and so initially, see
> above, is the root file).  I read the examples that use GetEntriesFast, but
> how does one see/set which tree is "active" for writing?

TDirectory::Get is a slow machinery. It loops on all the keys
sequentially.
A better solution is to find the TKey corresponding to a given name,
then
read the corresponding object. This exploits the THashList of keys.
Example

      THashList *lk = file.GetListOfKeys();
      TKey *key = (TKey*)lk->FindObject(name);
      TTree *T = (TTree*)key->ReadObj();
instead of
      TTree *T = (TTree*)file.Get(name);

> 
> - The AutoSave mechanism seems not to work under WinNT... reading/writing
> large root files will happily exhaust all (virtual)memory and force killing
> the program (that's why I immediately write a tree and delete it from
> memory... is there a better way?).
> 

You should disable some options on NT. I already saw that NT was doing
crazy things in automatic mode. May be Valery Fine can comment on this.

> Misc: TBenchmark:
>         - The class description states that specifying an existing name with
> Start() resets that bench's parameters... on my system it does not.  Also,
> wouldn't it useful to be able to force freeing of a slot in the bench table,
> for example by an additional parameter to Show?
> 

I suggest you use the class TStopwatch directly. You will get more
flexibility than with TBenchmark.

Rene Brun



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