25constexpr char const *kNTupleFileName =
"ntpl013_staged.root";
28constexpr int kNWriterThreads = 4;
31constexpr int kNEventsPerThread = 25000;
34constexpr int kNEventsPerBlock = 10000;
41 static std::mutex g_Mutex;
44 using generator = std::mt19937;
48 auto fillContext =
writer->CreateFillContext();
49 fillContext->EnableStagedClusterCommitting();
50 auto entry = fillContext->CreateEntry();
52 auto eventId = entry->GetPtr<std::uint32_t>(
"eventId");
53 auto eventIdStart =
id * kNEventsPerThread;
54 auto rndm = entry->GetPtr<
float>(
"rndm");
56 for (
int i = 0; i < kNEventsPerThread; i++) {
58 *eventId = eventIdStart + i;
59 auto d =
static_cast<double>(gen()) / generator::max();
60 *rndm =
static_cast<float>(
d);
63 fillContext->Fill(*entry);
67 fillContext->FlushCluster();
69 std::lock_guard
g(g_Mutex);
70 fillContext->CommitStagedClusters();
71 std::cout <<
"Thread #" <<
id <<
" wrote events #" << eventIdStart <<
" - #"
72 << (eventIdStart + kNEventsPerThread - 1) <<
" as entries #" << g_WrittenEntries <<
" - #"
73 << (g_WrittenEntries + kNEventsPerThread - 1) << std::endl;
74 g_WrittenEntries += kNEventsPerThread;
81 std::cout <<
" === Writing with staged cluster committing ===" << std::endl;
85 model->MakeField<std::uint32_t>(
"eventId");
86 model->MakeField<
float>(
"rndm");
98 std::vector<std::thread> threads;
99 for (
int i = 0; i < kNWriterThreads; ++i)
100 threads.emplace_back(FillData, i,
writer.get());
101 for (
int i = 0; i < kNWriterThreads; ++i)
112 static std::mutex g_Mutex;
115 using generator = std::mt19937;
119 auto fillContext =
writer->CreateFillContext();
120 fillContext->EnableStagedClusterCommitting();
121 auto entry = fillContext->CreateEntry();
123 auto eventId = entry->GetPtr<std::uint32_t>(
"eventId");
124 auto eventIdStart =
id * kNEventsPerThread;
125 int startOfBlock = 0;
126 auto rndm = entry->GetPtr<
float>(
"rndm");
128 for (
int i = 0; i < kNEventsPerThread; i++) {
130 *eventId = eventIdStart + i;
131 auto d =
static_cast<double>(gen()) / generator::max();
132 *rndm =
static_cast<float>(
d);
135 fillContext->Fill(*entry);
137 if ((i + 1) % kNEventsPerBlock == 0) {
139 fillContext->FlushCluster();
141 std::lock_guard
g(g_Mutex);
142 fillContext->CommitStagedClusters();
143 auto firstEvent = eventIdStart + startOfBlock;
144 auto lastEvent = eventIdStart + i;
145 std::cout <<
"Thread #" <<
id <<
" wrote events #" << firstEvent <<
" - #" << lastEvent <<
" as entries #"
146 << g_WrittenEntries <<
" - #" << (g_WrittenEntries + kNEventsPerBlock - 1) << std::endl;
147 g_WrittenEntries += kNEventsPerBlock;
148 startOfBlock += kNEventsPerBlock;
154 fillContext->FlushCluster();
156 std::lock_guard
g(g_Mutex);
157 fillContext->CommitStagedClusters();
158 auto firstEvent = eventIdStart + startOfBlock;
159 auto lastEvent = eventIdStart + kNEventsPerThread - 1;
160 auto numEvents = kNEventsPerThread - startOfBlock;
161 std::cout <<
"Thread #" <<
id <<
" wrote events #" << firstEvent <<
" - #" << lastEvent <<
" as entries #"
162 << g_WrittenEntries <<
" - #" << (g_WrittenEntries + numEvents - 1) << std::endl;
163 g_WrittenEntries += numEvents;
170 std::cout <<
"\n === ... with sequencing in blocks of " << kNEventsPerBlock <<
" events ===" << std::endl;
174 model->MakeField<std::uint32_t>(
"eventId");
175 model->MakeField<
float>(
"rndm");
188 std::vector<std::thread> threads;
189 for (
int i = 0; i < kNWriterThreads; ++i)
190 threads.emplace_back(FillDataInBlocks, i,
writer.get());
191 for (
int i = 0; i < kNWriterThreads; ++i)
static std::unique_ptr< RNTupleModel > CreateBare()
Creates a "bare model", i.e. an RNTupleModel with no default entry.
A writer to fill an RNTuple from multiple contexts.
static std::unique_ptr< RNTupleParallelWriter > Recreate(std::unique_ptr< ROOT::RNTupleModel > model, std::string_view ntupleName, std::string_view storage, const ROOT::RNTupleWriteOptions &options=ROOT::RNTupleWriteOptions())
Recreate a new file and return a writer to write an RNTuple.
Common user-tunable settings for storing RNTuples.
void SetApproxZippedClusterSize(std::size_t val)
void FillData(BinData &dv, const TH1 *hist, TF1 *func=nullptr)
fill the data vector from a TH1.
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.