I’m writing several TNtuples to a file, performing operations on them, and then deleting them from the file. When I delete them however, the space doesn’t seem to get freed up even though the TTrees are no longer visible in the TBrowser.
I’ve tried using TFile->Delete(“foo;*”); and TNtuple->Delete(“all”); as listed in the class reference without any luck. Can anyone point me in the right direction?
Below is a simple root macro that replicates the problem. The filesize of the ntuple doesn’t seem to change from 3.9MB whether lines 20 and 21 are commented out or not. If I try using only line 20, the ntuple is still visible in the TBrowser. If I use line 21 only the ntuple disappears but takes up the same size.
#include <TFile.h>
#include <TNtuple.h>
#include <TROOT.h>
#include <TSystem.h>
#include <TRandom.h>
#include <TInterpreter.h>
int testDelete(){
TFile *f = new TFile("test.root","RECREATE","test");
TNtuple *ntuple = new TNtuple("ntuple","Demo ntuple","px:py:pz:random:i");
gRandom->SetSeed();
Float_t px, py, pz;
for (Int_t i = 0; i < 25000; i++){
gRandom->Rannor(px,py);
pz = px*px + py*py;
Float_t random = gRandom->Rndm(1);
ntuple->Fill(px,py,pz,random,i);
}
ntuple->Delete("all"); //As listed in TTree docs, but this doesn't work
f->Delete("ntuple;*"); //As listed in TFile docs, but this doesn't work
f->Write();
f->Close();
}
I’m not sure I understand. Do you mean If I write this file out after deleting the ntuple, reopen it using “UPDATE” and write it once more, the filesize will shrink?
Could you provide a brief example, perhaps based on the macro I supplied that results in a reduction in size of the created TFile once the ntuple is deleted?
The simplest solution is to create another small file containing only the histograms.
-delete the ntuple;1 in filebig.root
-close the file
-run, eg, the hadd utility like
hadd -f filesmall.root filebig.root
Thanks, but I’m trying to do this all in a single binary.
In the end, I’m using stdio’s tmpnam function to name a temporary file, and writing the ntuples to it at the same time as writing the histograms to a different file. At the end of the code I remove the temporary file.