48 "wall clock time spent in critical sections"),
50 "CPU time spent compressing"),
52 "timeCpuCriticalSection",
"ns",
"CPU time spent in critical section")});
76 f.SetOnDiskId(fNFields);
85 fBufferedColumns.resize(fNColumns);
90 return fInnerSink->GetDescriptor();
97 fInnerModel = model.
Clone();
98 fInnerSink->Init(*fInnerModel);
111 fInnerModel->AddField(std::move(
cloned));
123 &fInnerModel->GetConstField(
projectedFields.GetSourceField(&
f)->GetQualifiedFieldName());
128 fInnerModel->Unfreeze();
131 std::transform(
changeset.fAddedProjectedFields.cbegin(),
changeset.fAddedProjectedFields.cend(),
133 fInnerModel->Freeze();
140 RNTuplePlainTimer
timer(fCounters->fTimeWallCriticalSection, fCounters->fTimeCpuCriticalSection);
157 std::size_t
maxSealedPageBytes =
page.GetNBytes() + GetWriteOptions().GetEnablePageChecksums() * kNBytesPageChecksum;
177 if (!fTaskScheduler) {
184 config.
fWriteChecksum = GetWriteOptions().GetEnablePageChecksums();
188 RNTupleAtomicTimer
timer(fCounters->fTimeWallZip, fCounters->fTimeCpuZip);
197 zipItem.fPage = fPageAllocator->NewPage(
page.GetElementSize(),
page.GetNElements());
202 fCounters->fParallelZip.SetValue(1);
211 config.
fWriteChecksum = GetWriteOptions().GetEnablePageChecksums();
232 std::span<ROOT::Internal::RPageStorage::RSealedPageGroup> )
244 std::vector<RSealedPageGroup>
toCommit;
245 toCommit.reserve(fBufferedColumns.size());
246 for (
auto &
bufColumn : fBufferedColumns) {
254 RNTuplePlainTimer
timer(fCounters->fTimeWallCriticalSection, fCounters->fTimeCpuCriticalSection);
255 fInnerSink->CommitSealedPageV(
toCommit);
257 for (
auto handle : fSuppressedColumns)
258 fInnerSink->CommitSuppressedColumn(handle);
259 fSuppressedColumns.clear();
285 RNTuplePlainTimer
timer(fCounters->fTimeWallCriticalSection, fCounters->fTimeCpuCriticalSection);
286 fInnerSink->CommitStagedClusters(
clusters);
292 RNTuplePlainTimer
timer(fCounters->fTimeWallCriticalSection, fCounters->fTimeCpuCriticalSection);
293 fInnerSink->CommitClusterGroup();
299 RNTuplePlainTimer
timer(fCounters->fTimeWallCriticalSection, fCounters->fTimeCpuCriticalSection);
300 fInnerSink->CommitDataset();
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
winID h TVirtualViewer3D TVirtualGLPainter p
A thread-safe integral performance counter.
A collection of Counter objects with a name, a unit, and a description.
void ObserveMetrics(RNTupleMetrics &observee)
CounterPtrT MakeCounter(const std::string &name, Args &&... args)
A non thread-safe integral performance counter.
A column is a storage-backed array of a simple, fixed-size type, from which pages can be mapped into ...
std::deque< RPageZipItem > fBufferedPages
Using a deque guarantees that element iterators are never invalidated by appends to the end of the it...
RPageStorage::SealedPageSequence_t fSealedPages
Pages that have been already sealed by a concurrent task.
RPage ReservePage(ColumnHandle_t columnHandle, std::size_t nElements) final
Get a new, empty page for the given column that can be filled with up to nElements; nElements must be...
void CommitStagedClusters(std::span< RStagedCluster > clusters) final
Commit staged clusters, logically appending them to the ntuple descriptor.
std::unique_ptr< RCounters > fCounters
std::uint64_t CommitCluster(ROOT::NTupleSize_t nNewEntries) final
Finalize the current cluster and create a new one for the following data.
void FlushClusterImpl(std::function< void(void)> FlushClusterFn)
void UpdateSchema(const RNTupleModelChangeset &changeset, ROOT::NTupleSize_t firstEntry) final
Incorporate incremental changes to the model into the ntuple descriptor.
void CommitSealedPage(ROOT::DescriptorId_t physicalColumnId, const RSealedPage &sealedPage) final
Write a preprocessed page to storage. The column must have been added before.
RPageSinkBuf(std::unique_ptr< RPageSink > inner)
void CommitDatasetImpl() final
const ROOT::RNTupleDescriptor & GetDescriptor() const final
Return the RNTupleDescriptor being constructed.
void UpdateExtraTypeInfo(const ROOT::RExtraTypeInfoDescriptor &extraTypeInfo) final
Adds an extra type information record to schema.
void CommitSealedPageV(std::span< RPageStorage::RSealedPageGroup > ranges) final
Write a vector of preprocessed pages to storage. The corresponding columns must have been added befor...
RStagedCluster StageCluster(ROOT::NTupleSize_t nNewEntries) final
Stage the current cluster and create a new one for the following data.
void CommitPage(ColumnHandle_t columnHandle, const RPage &page) final
Write a page to the storage. The column must have been added before.
void CommitSuppressedColumn(ColumnHandle_t columnHandle) final
Commits a suppressed column for the current cluster.
void CommitClusterGroup() final
Write out the page locations (page list envelope) for all the committed clusters since the last call ...
void InitImpl(ROOT::RNTupleModel &model) final
std::unique_ptr< RPageSink > fInnerSink
The inner sink, responsible for actually performing I/O.
void ConnectFields(const std::vector< ROOT::RFieldBase * > &fields, ROOT::NTupleSize_t firstEntry)
ColumnHandle_t AddColumn(ROOT::DescriptorId_t fieldId, RColumn &column) final
Register a new column.
An RAII wrapper used to synchronize a page sink. See GetSinkGuard().
Abstract interface to write data into an ntuple.
const ROOT::RNTupleWriteOptions & GetWriteOptions() const
Returns the sink's write options.
ROOT::Experimental::Detail::RNTupleMetrics fMetrics
const std::string & GetNTupleName() const
Returns the NTuple name.
A page is a slice of a column that is mapped into memory.
std::unordered_map< const ROOT::RFieldBase *, const ROOT::RFieldBase * > FieldMap_t
The map keys are the projected target fields, the map values are the backing source fields Note that ...
RResult< void > Add(std::unique_ptr< ROOT::RFieldBase > field, const FieldMap_t &fieldMap)
Adds a new projected field.
Base class for all ROOT issued exceptions.
A field translates read and write calls from/to underlying columns to/from tree values.
The on-storage metadata of an RNTuple.
The RNTupleModel encapulates the schema of an RNTuple.
std::unique_ptr< RNTupleModel > Clone() const
const_iterator begin() const
ROOT::RFieldZero & GetFieldZeroOfModel(RNTupleModel &model)
std::unique_ptr< T[]> MakeUninitArray(std::size_t size)
Make an array of default-initialized elements.
RProjectedFields & GetProjectedFieldsOfModel(RNTupleModel &model)
void CallConnectPageSinkOnField(RFieldBase &, ROOT::Internal::RPageSink &, ROOT::NTupleSize_t firstEntry=0)
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.
The incremental changes to a RNTupleModel
I/O performance counters that get registered in fMetrics.
Parameters for the SealPage() method.
bool fWriteChecksum
Adds a 8 byte little-endian xxhash3 checksum to the page payload.
std::uint32_t fCompressionSettings
Compression algorithm and level to apply.
void * fBuffer
Location for sealed output. The memory buffer has to be large enough.
const ROOT::Internal::RPage * fPage
Input page to be sealed.
bool fAllowAlias
If false, the output buffer must not point to the input page buffer, which would otherwise be an opti...
const ROOT::Internal::RColumnElementBase * fElement
Corresponds to the page's elements, for size calculation etc.
Cluster that was staged, but not yet logically appended to the RNTuple.
A sealed page contains the bytes of a page as written to storage (packed & compressed).