98 const TClass *cl =
nullptr;
110 std::to_string(
field->GetTypeVersion()) +
"]"));
128 RNTupleAtomicTimer
timer(fCounters->fTimeWallWrite, fCounters->fTimeCpuWrite);
135 fCounters->fNPageCommitted.Inc();
136 fCounters->fSzWritePayload.Add(
sealedPage.GetBufferSize());
137 fNBytesCurrentCluster +=
sealedPage.GetBufferSize();
147 RNTupleAtomicTimer
timer(fCounters->fTimeWallZip, fCounters->fTimeCpuZip);
151 fCounters->fSzZip.Add(
page.GetNBytes());
158 const auto nBits = fDescriptorBuilder.GetDescriptor().GetColumnDescriptor(
physicalColumnId).GetBitsOnStorage();
165 RNTupleAtomicTimer
timer(fCounters->fTimeWallWrite, fCounters->fTimeCpuWrite);
167 std::uint64_t
offset = fWriter->ReserveBlob(
batch.fSize,
batch.fBytesPacked);
180 fCounters->fNPageCommitted.Add(
batch.fSealedPages.size());
181 fCounters->fSzWritePayload.Add(
batch.fSize);
182 fNBytesCurrentCluster +=
batch.fSize;
185 batch.fBytesPacked = 0;
186 batch.fSealedPages.clear();
189std::vector<ROOT::RNTupleLocator>
191 const std::vector<bool> &
mask)
193 const std::uint64_t
maxKeySize = fOptions->GetMaxKeySize();
196 std::vector<RNTupleLocator>
locators;
198 std::size_t
iPage = 0;
207 fDescriptorBuilder.GetDescriptor().GetColumnDescriptor(
range.fPhysicalColumnId).GetBitsOnStorage();
241 fCounters->fNPageCommitted.Inc();
242 fCounters->fSzWritePayload.Add(
sealedPageIt->GetBufferSize());
253 if (
batch.fSize > 0) {
262 auto result = fNBytesCurrentCluster;
263 fNBytesCurrentCluster = 0;
284 for (
const auto &
extraTypeInfo : fDescriptorBuilder.GetDescriptor().GetExtraTypeInfoIterable()) {
292 fWriter->UpdateStreamerInfos(fInfosOfClassFields);
298 fWriter->Commit(GetWriteOptions().GetCompression());
301std::unique_ptr<ROOT::Internal::RPageSink>
305 auto writer = fWriter->CloneWithDifferentName(
name);
319 std::unique_ptr<ROOT::Internal::RRawFile> file,
323 fFile = std::move(file);
334std::unique_ptr<ROOT::Internal::RPageSourceFile>
338 throw RException(
R__FAIL(
"This RNTuple object was not streamed from a ROOT file (TFile or descendant)"));
340 std::unique_ptr<ROOT::Internal::RRawFile>
rawFile;
344 std::string className =
anchor.fFile->IsA()->GetName();
345 auto url =
anchor.fFile->GetEndpointUrl();
346 auto protocol = std::string(
url->GetProtocol());
347 if (className ==
"TFile") {
349 }
else if (className ==
"TDavixFile" || className ==
"TNetXNGFile") {
355 auto pageSource = std::make_unique<RPageSourceFile>(
"", std::move(
rawFile), options);
363 fClusterPool.StopBackgroundThread();
366std::unique_ptr<ROOT::Internal::RPageSourceFile>
369 auto pageSource = std::make_unique<RPageSourceFile>(
"", fFile->Clone(), options);
380 fAnchor = fReader.GetNTuple(fNTupleName).Unwrap();
382 fReader.SetMaxKeySize(fAnchor->GetMaxKeySize());
384 fDescriptorBuilder.SetVersion(fAnchor->GetVersionEpoch(), fAnchor->GetVersionMajor(), fAnchor->GetVersionMinor(),
385 fAnchor->GetVersionPatch());
386 fDescriptorBuilder.SetOnDiskHeaderSize(fAnchor->GetNBytesHeader());
387 fDescriptorBuilder.AddToOnDiskFooterSize(fAnchor->GetNBytesFooter());
390 const auto bufSize = fAnchor->GetNBytesHeader() + fAnchor->GetNBytesFooter() +
391 std::max(fAnchor->GetLenHeader(), fAnchor->GetLenFooter());
393 fStructureBuffer.fPtrHeader = fStructureBuffer.fBuffer.get();
394 fStructureBuffer.fPtrFooter = fStructureBuffer.fBuffer.get() + fAnchor->GetNBytesHeader();
401 (std::max(fAnchor->GetNBytesHeader(), fAnchor->GetNBytesFooter()) >
readvLimits.fMaxSingleSize) ||
402 (fAnchor->GetNBytesHeader() + fAnchor->GetNBytesFooter() >
readvLimits.fMaxTotalSize)) {
403 RNTupleAtomicTimer
timer(fCounters->fTimeWallRead, fCounters->fTimeCpuRead);
404 fReader.ReadBuffer(fStructureBuffer.fPtrHeader, fAnchor->GetNBytesHeader(), fAnchor->GetSeekHeader());
405 fReader.ReadBuffer(fStructureBuffer.fPtrFooter, fAnchor->GetNBytesFooter(), fAnchor->GetSeekFooter());
406 fCounters->fNRead.Add(2);
408 RNTupleAtomicTimer
timer(fCounters->fTimeWallRead, fCounters->fTimeCpuRead);
409 R__ASSERT(fAnchor->GetNBytesHeader() < std::numeric_limits<std::size_t>::max());
410 R__ASSERT(fAnchor->GetNBytesFooter() < std::numeric_limits<std::size_t>::max());
412 static_cast<std::size_t
>(fAnchor->GetNBytesHeader()), 0},
413 {fStructureBuffer.fPtrFooter, fAnchor->GetSeekFooter(),
414 static_cast<std::size_t
>(fAnchor->GetNBytesFooter()), 0}};
416 fCounters->fNReadV.Inc();
422 auto unzipBuf =
reinterpret_cast<unsigned char *
>(fStructureBuffer.fPtrFooter) + fAnchor->GetNBytesFooter();
432 auto desc = fDescriptorBuilder.MoveDescriptor();
436 if (fNTupleName.empty())
437 fNTupleName = desc.GetName();
439 std::vector<unsigned char> buffer;
440 for (
const auto &
cgDesc : desc.GetClusterGroupIterable()) {
441 buffer.resize(std::max<size_t>(buffer.size(),
442 cgDesc.GetPageListLength() +
cgDesc.GetPageListLocator().GetNBytesOnStorage()));
444 fReader.ReadBuffer(
zipBuffer,
cgDesc.GetPageListLocator().GetNBytesOnStorage(),
445 cgDesc.GetPageListLocator().GetPosition<std::uint64_t>());
447 cgDesc.GetPageListLength(), buffer.data());
453 fFile->SetBuffering(
false);
477 pageInfo.GetLocator().GetPosition<std::uint64_t>());
484 sealedPage.VerifyChecksumIfEnabled().ThrowOnError();
517 RNTupleAtomicTimer
timer(fCounters->fTimeWallRead, fCounters->fTimeCpuRead);
519 pageInfo.GetLocator().GetPosition<std::uint64_t>());
521 fCounters->fNPageRead.Inc();
522 fCounters->fNRead.Inc();
523 fCounters->fSzReadPayload.Add(
sealedPage.GetBufferSize());
526 if (!fCurrentCluster || (fCurrentCluster->GetId() !=
clusterId) || !fCurrentCluster->ContainsColumn(
columnId))
527 fCurrentCluster = fClusterPool.GetCluster(
clusterId, fActivePhysicalColumns.ToColumnSet());
536 auto onDiskPage = fCurrentCluster->GetOnDiskPage(key);
543 RNTupleAtomicTimer
timer(fCounters->fTimeWallUnzip, fCounters->fTimeCpuUnzip);
550 fCounters->fNPageUnsealed.Inc();
557 clone->fFile = fFile->Clone();
559 return std::unique_ptr<RPageSourceFile>(clone);
562std::unique_ptr<ROOT::Internal::RCluster>
564 std::vector<ROOT::Internal::RRawFile::RIOVec> &
readRequests)
569 std::uint64_t fOffset = 0;
570 std::uint64_t
fSize = 0;
576 auto pageZeroMap = std::make_unique<ROnDiskPageMap>();
601 std::vector<std::size_t>
gaps;
604 for (
unsigned i = 1; i <
onDiskPages.size(); ++i) {
607 gaps.emplace_back(std::max(gap, std::int64_t(0)));
615 for (
auto g :
gaps) {
637 const std::uint64_t
maxKeySize = fReader.GetMaxKeySize();
642 const std::uint64_t
overhead = std::max(
static_cast<std::int64_t
>(s.fOffset) -
readUpTo, std::int64_t(0));
643 const std::uint64_t
extent = std::max(
static_cast<std::int64_t
>(s.fOffset + s.fSize) -
readUpTo, std::int64_t(0));
647 s.fBufPos =
reinterpret_cast<intptr_t
>(
req.fBuffer) + s.fOffset -
req.fOffset;
656 req.fBuffer =
reinterpret_cast<unsigned char *
>(
req.fBuffer) +
req.fSize;
657 s.fBufPos =
reinterpret_cast<intptr_t
>(
req.fBuffer);
660 req.fOffset = s.fOffset;
664 fCounters->fSzReadPayload.Add(
szPayload);
668 auto buffer =
new unsigned char[
reinterpret_cast<intptr_t
>(
req.fBuffer) +
req.fSize];
669 auto pageMap = std::make_unique<ROOT::Internal::ROnDiskPageMapHeap>(std::unique_ptr<
unsigned char[]>(buffer));
687std::vector<std::unique_ptr<ROOT::Internal::RCluster>>
690 fCounters->fNClusterLoaded.Add(
clusterKeys.size());
692 std::vector<std::unique_ptr<ROOT::Internal::RCluster>>
clusters;
693 std::vector<ROOT::Internal::RRawFile::RIOVec>
readRequests;
711 for (std::size_t i = 0; i <
nBatch; ++i) {
727 RNTupleAtomicTimer
timer(fCounters->fTimeWallRead, fCounters->fTimeCpuRead);
730 RNTupleAtomicTimer
timer(fCounters->fTimeWallRead, fCounters->fTimeCpuRead);
733 fCounters->fNReadV.Inc();
734 fCounters->fNRead.Add(
nBatch);
745 fReader.LoadStreamerInfo();
#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.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t mask
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
Option_t Option_t TPoint TPoint const char mode
An interface to read from, or write to, a ROOT file, as well as performing other common operations.
Read RNTuple data blocks from a TFile container, provided by a RRawFile.
static std::size_t Zip(const void *from, std::size_t nbytes, int compression, void *to)
Returns the size of the compressed data, written into the provided output buffer.
static void Unzip(const void *from, size_t nbytes, size_t dataLen, void *to)
The nbytes parameter provides the size ls of the from buffer.
static std::unique_ptr< RNTupleFileWriter > Recreate(std::string_view ntupleName, std::string_view path, EContainerFormat containerFormat, const ROOT::RNTupleWriteOptions &options)
Create or truncate the local file given by path with the new empty RNTuple identified by ntupleName.
static std::unique_ptr< RNTupleFileWriter > Append(std::string_view ntupleName, TDirectory &fileOrDirectory, std::uint64_t maxKeySize)
The directory parameter can also be a TFile object (TFile inherits from TDirectory).
static RResult< void > DeserializePageList(const void *buffer, std::uint64_t bufSize, ROOT::DescriptorId_t clusterGroupId, RNTupleDescriptor &desc, EDescriptorDeserializeMode mode)
static RResult< void > DeserializeFooter(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder)
static RResult< StreamerInfoMap_t > DeserializeStreamerInfos(const std::string &extraTypeInfoContent)
EDescriptorDeserializeMode
static RResult< void > DeserializeHeader(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder)
A page as being stored on disk, that is packed and compressed.
Base class for a sink with a physical storage backend.
void UpdateSchema(const ROOT::Internal::RNTupleModelChangeset &changeset, ROOT::NTupleSize_t firstEntry) override
Incorporate incremental changes to the model into the ntuple descriptor.
void EnableDefaultMetrics(const std::string &prefix)
Enables the default set of metrics provided by RPageSink.
Storage provider that write ntuple pages into a file.
void CommitBatchOfPages(CommitBatch &batch, std::vector< RNTupleLocator > &locators)
Subroutine of CommitSealedPageVImpl, used to perform a vector write of the (multi-)range of pages con...
RPageSinkFile(std::string_view ntupleName, const ROOT::RNTupleWriteOptions &options)
std::unique_ptr< RPageSink > CloneWithDifferentName(std::string_view name, const ROOT::RNTupleWriteOptions &opts) const override
Creates a new sink that uses the same underlying file/directory but writes to a different RNTuple wit...
std::uint64_t StageClusterImpl() final
Returns the number of bytes written to storage (excluding metadata)
void CommitDatasetImpl() final
void InitImpl(unsigned char *serializedHeader, std::uint32_t length) final
RNTupleLocator CommitPageImpl(ColumnHandle_t columnHandle, const RPage &page) override
RNTupleLocator WriteSealedPage(const RPageStorage::RSealedPage &sealedPage, std::size_t bytesPacked)
We pass bytesPacked so that TFile::ls() reports a reasonable value for the compression ratio of the c...
RNTupleLocator CommitClusterGroupImpl(unsigned char *serializedPageList, std::uint32_t length) final
Returns the locator of the page list envelope of the given buffer that contains the serialized page l...
RNTupleLocator CommitSealedPageImpl(ROOT::DescriptorId_t physicalColumnId, const RPageStorage::RSealedPage &sealedPage) final
std::unique_ptr< ROOT::Internal::RNTupleFileWriter > fWriter
~RPageSinkFile() override
void UpdateSchema(const ROOT::Internal::RNTupleModelChangeset &changeset, ROOT::NTupleSize_t firstEntry) final
Incorporate incremental changes to the model into the ntuple descriptor.
std::vector< RNTupleLocator > CommitSealedPageVImpl(std::span< RPageStorage::RSealedPageGroup > ranges, const std::vector< bool > &mask) final
Vector commit of preprocessed pages.
Storage provider that reads ntuple pages from a file.
std::unique_ptr< ROOT::Internal::RCluster > PrepareSingleCluster(const ROOT::Internal::RCluster::RKey &clusterKey, std::vector< RRawFile::RIOVec > &readRequests)
Helper function for LoadClusters: it prepares the memory buffer (page map) and the read requests for ...
std::unique_ptr< RPageSourceFile > OpenWithDifferentAnchor(const RNTuple &anchor, const ROOT::RNTupleReadOptions &options=ROOT::RNTupleReadOptions())
Creates a new PageSourceFile using the same underlying file as this but referring to a different RNTu...
~RPageSourceFile() override
RPageRef LoadPageImpl(ColumnHandle_t columnHandle, const RClusterInfo &clusterInfo, ROOT::NTupleSize_t idxInCluster) final
static std::unique_ptr< RPageSourceFile > CreateFromAnchor(const RNTuple &anchor, const ROOT::RNTupleReadOptions &options=ROOT::RNTupleReadOptions())
Used from the RNTuple class to build a datasource if the anchor is already available.
ROOT::RNTupleDescriptor AttachImpl(RNTupleSerializer::EDescriptorDeserializeMode mode) final
LoadStructureImpl() has been called before AttachImpl() is called
std::vector< std::unique_ptr< ROOT::Internal::RCluster > > LoadClusters(std::span< ROOT::Internal::RCluster::RKey > clusterKeys) final
Populates all the pages of the given cluster ids and columns; it is possible that some columns do not...
RPageSourceFile(std::string_view ntupleName, const ROOT::RNTupleReadOptions &options)
std::unique_ptr< RPageSource > CloneImpl() const final
The cloned page source creates a new raw file and reader and opens its own file descriptor to the dat...
void LoadStructureImpl() final
void LoadStreamerInfo() final
Forces the loading of ROOT StreamerInfo from the underlying file.
std::unique_ptr< RRawFile > fFile
An RRawFile is used to request the necessary byte ranges from a local or a remote file.
ROOT::Internal::RMiniFileReader fReader
Takes the fFile to read ntuple blobs from it.
void LoadSealedPage(ROOT::DescriptorId_t physicalColumnId, RNTupleLocalIndex localIndex, RSealedPage &sealedPage) final
Read the packed and compressed bytes of a page into the memory buffer provided by sealedPage.
Abstract interface to read data from an ntuple.
void EnableDefaultMetrics(const std::string &prefix)
Enables the default set of metrics provided by RPageSource.
Stores information about the cluster in which this page resides.
A page is a slice of a column that is mapped into memory.
static const void * GetPageZeroBuffer()
Return a pointer to the page zero buffer used if there is no on-disk data for a particular deferred c...
The RRawFileTFile wraps an open TFile, but does not take ownership.
The RRawFile provides read-only access to local and remote files.
static std::unique_ptr< RRawFile > Create(std::string_view url, ROptions options=ROptions())
Factory method that returns a suitable concrete implementation according to the transport in the url.
The field for a class with dictionary.
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.
Addresses a column element or field item relative to a particular cluster, instead of a global NTuple...
Generic information about the physical location of data.
Common user-tunable settings for reading RNTuples.
Common user-tunable settings for storing RNTuples.
std::uint64_t GetMaxKeySize() const
Representation of an RNTuple data set in a ROOT file.
const_iterator begin() const
const_iterator end() const
The field for a class using ROOT standard streaming.
TClass instances represent classes, structs and namespaces in the ROOT type system.
TVirtualStreamerInfo * GetStreamerInfo(Int_t version=0, Bool_t isTransient=kFALSE) const
returns a pointer to the TVirtualStreamerInfo object for version If the object does not exist,...
Describe directory structure in memory.
const char * GetName() const override
Returns name of object.
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 identifiers that specifies the content of a (partial) cluster.
The incremental changes to a RNTupleModel
On-disk pages within a page source are identified by the column and page number.
Summarizes cluster-level information that are necessary to load a certain page.
A sealed page contains the bytes of a page as written to storage (packed & compressed).
Used for vector reads from multiple offsets into multiple buffers.
Information about a single page in the context of a cluster's page range.