Logo ROOT   6.16/01
Reference Guide
TBufferMerger.hxx
Go to the documentation of this file.
1// @(#)root/io:$Id$
2// Author: Philippe Canal, Witold Pokorski, and Guilherme Amadio
3
4/*************************************************************************
5 * Copyright (C) 1995-2017, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#ifndef ROOT_TBufferMerger
13#define ROOT_TBufferMerger
14
15#include "TFileMerger.h"
16#include "TMemFile.h"
17
18#include <functional>
19#include <memory>
20#include <mutex>
21#include <queue>
22
23namespace ROOT {
24namespace Experimental {
25
26class TBufferMergerFile;
27
28/**
29 * \class TBufferMerger TBufferMerger.hxx
30 * \ingroup IO
31 *
32 * TBufferMerger is a class to facilitate writing data in
33 * parallel from multiple threads, while writing to a single
34 * output file. Its purpose is similar to TParallelMergingFile,
35 * but instead of using processes that connect to a network
36 * socket, TBufferMerger uses threads that each write to a
37 * TBufferMergerFile, which in turn push data into a queue
38 * managed by the TBufferMerger.
39 */
40
42public:
43 /** Constructor
44 * @param name Output file name
45 * @param option Output file creation options
46 * @param compression Output file compression level
47 */
49
50 /** Constructor
51 * @param output Output \c TFile
52 */
53 TBufferMerger(std::unique_ptr<TFile> output);
54
55 /** Destructor */
56 virtual ~TBufferMerger();
57
58 /** Returns a TBufferMergerFile to which data can be written.
59 * At the end, all TBufferMergerFiles get merged into the output file.
60 * The user is responsible to "cd" into the file to associate objects
61 * such as histograms or trees to it.
62 *
63 * After the creation of this file, the user must reset the kMustCleanup
64 * bit on any objects attached to it and take care of their deletion, as
65 * there is a possibility that a race condition will happen that causes
66 * a crash if ROOT manages these objects.
67 */
68 std::shared_ptr<TBufferMergerFile> GetFile();
69
70 /** Returns the number of buffers currently in the queue. */
71 size_t GetQueueSize() const;
72
73 /** Returns the current value of the auto save setting in bytes (default = 0). */
74 size_t GetAutoSave() const;
75
76 /** By default, TBufferMerger will call TFileMerger::PartialMerge() for each
77 * buffer pushed onto its merge queue. This function lets the user change
78 * this behaviour by telling TBufferMerger to accumulate at least size
79 * bytes in memory before performing a partial merge and flushing to disk.
80 * This can be useful to avoid an excessive amount of work to happen in the
81 * output thread, as the number of TTree headers (which require compression)
82 * written to disk can be reduced.
83 */
84 void SetAutoSave(size_t size);
85
86 friend class TBufferMergerFile;
87
88private:
89 /** TBufferMerger has no default constructor */
91
92 /** TBufferMerger has no copy constructor */
94
95 /** TBufferMerger has no copy operator */
97
98 void Init(std::unique_ptr<TFile>);
99
100 void Merge();
101 void Push(TBufferFile *buffer);
102
103 size_t fAutoSave{0}; //< AutoSave only every fAutoSave bytes
104 size_t fBuffered{0}; //< Number of bytes currently buffered
105 TFileMerger fMerger{false, false}; //< TFileMerger used to merge all buffers
106 std::mutex fMergeMutex; //< Mutex used to lock fMerger
107 std::mutex fQueueMutex; //< Mutex used to lock fQueue
108 std::queue<TBufferFile *> fQueue; //< Queue to which data is pushed and merged
109 std::vector<std::weak_ptr<TBufferMergerFile>> fAttachedFiles; //< Attached files
110};
111
112/**
113 * \class TBufferMerger TBufferMerger.hxx
114 * \ingroup IO
115 *
116 * A TBufferMergerFile is similar to a TMemFile, but when data
117 * is written to it, it is appended to the TBufferMerger queue.
118 * The TBufferMerger merges all data into the output file on disk.
119 */
120
122private:
123 TBufferMerger &fMerger; //< TBufferMerger this file is attached to
124
125 /** Constructor. Can only be called by TBufferMerger.
126 * @param m Merger this file is attached to. */
128
129 /** TBufferMergerFile has no default constructor. */
131
132 /** TBufferMergerFile has no copy constructor. */
134
135 /** TBufferMergerFile has no copy operator */
137
138 friend class TBufferMerger;
139
140public:
141 /** Destructor */
143
144 using TMemFile::Write;
145
146 /** Write data into a TBufferFile and append it to TBufferMerger.
147 * @param name Name
148 * @param opt Options
149 * @param bufsize Buffer size
150 * This function must be called before the TBufferMergerFile gets destroyed,
151 * or no data is appended to the TBufferMerger.
152 */
153 virtual Int_t Write(const char *name = nullptr, Int_t opt = 0, Int_t bufsize = 0) override;
154
156};
157
158} // namespace Experimental
159} // namespace ROOT
160
161#endif
int Int_t
Definition: RtypesCore.h:41
const char Option_t
Definition: RtypesCore.h:62
TBufferMergerFile()
TBufferMergerFile has no default constructor.
virtual Int_t Write(const char *name=nullptr, Int_t opt=0, Int_t bufsize=0) override
Write data into a TBufferFile and append it to TBufferMerger.
TBufferMergerFile(const TBufferMergerFile &)
TBufferMergerFile has no copy constructor.
TBufferMergerFile & operator=(const TBufferMergerFile &)
TBufferMergerFile has no copy operator.
ClassDefOverride(TBufferMergerFile, 0)
TBufferMerger is a class to facilitate writing data in parallel from multiple threads,...
void Push(TBufferFile *buffer)
std::shared_ptr< TBufferMergerFile > GetFile()
Returns a TBufferMergerFile to which data can be written.
std::queue< TBufferFile * > fQueue
size_t GetQueueSize() const
Returns the number of buffers currently in the queue.
void Init(std::unique_ptr< TFile >)
virtual ~TBufferMerger()
Destructor.
size_t GetAutoSave() const
Returns the current value of the auto save setting in bytes (default = 0).
void SetAutoSave(size_t size)
By default, TBufferMerger will call TFileMerger::PartialMerge() for each buffer pushed onto its merge...
TBufferMerger()
TBufferMerger has no default constructor.
TBufferMerger & operator=(const TBufferMerger &)
TBufferMerger has no copy operator.
TBufferMerger(const TBufferMerger &)
TBufferMerger has no copy constructor.
std::vector< std::weak_ptr< TBufferMergerFile > > fAttachedFiles
The concrete implementation of TBuffer for writing/reading to/from a ROOT file or socket.
Definition: TBufferFile.h:46
This class provides file copy and merging services.
Definition: TFileMerger.h:30
virtual Int_t Write(const char *name=0, Int_t opt=0, Int_t bufsiz=0)
Write memory objects to this file.
Definition: TFile.cxx:2335
A TMemFile is like a normal TFile except that it reads and writes only from memory.
Definition: TMemFile.h:19
Namespace for new ROOT classes and functions.
Definition: StringConv.hxx:21
@ kUseGeneralPurpose
Use the recommended general-purpose setting; moderate read / write speed and compression ratio.
Definition: Compression.h:53
auto * m
Definition: textangle.C:8