예제 #1
0
        public BTree2InternalNode(H5BinaryReader reader, Superblock superblock, BTree2Header <T> header, ushort recordCount, int nodeLevel, Func <T> decodeKey)
            : base(reader, header, recordCount, BTree2InternalNode <T> .Signature, decodeKey)
        {
            this.NodePointers = new BTree2NodePointer[recordCount + 1];

            // H5B2cache.c (H5B2__cache_int_deserialize)
            for (int i = 0; i < recordCount + 1; i++)
            {
                // address
                this.NodePointers[i].Address = superblock.ReadOffset(reader);

                // record count
                var childRecordCount = H5Utils.ReadUlong(reader, header.MaxRecordCountSize);
                this.NodePointers[i].RecordCount = (ushort)childRecordCount;

                // total record count
                if (nodeLevel > 1)
                {
                    var totalChildRecordCount = H5Utils.ReadUlong(reader, header.NodeInfos[nodeLevel - 1].CumulatedTotalRecordCountSize);
                    this.NodePointers[i].TotalRecordCount = totalChildRecordCount;
                }
                else
                {
                    this.NodePointers[i].TotalRecordCount = childRecordCount;
                }
            }

            // checksum
            this.Checksum = reader.ReadUInt32();
        }
        public BTree2Node(H5BinaryReader reader, BTree2Header <T> header, ushort recordCount, byte[] signature, Func <T> decodeKey)
            : base(reader)
        {
            // signature
            var actualSignature = reader.ReadBytes(4);

            H5Utils.ValidateSignature(actualSignature, signature);

            // version
            this.Version = reader.ReadByte();

            // type
            this.Type = (BTree2Type)reader.ReadByte();

            if (this.Type != header.Type)
            {
                throw new FormatException($"The BTree2 internal node type ('{this.Type}') does not match the type defined in the header ('{header.Type}').");
            }

            // records
            this.Records = new T[recordCount];

            for (ulong i = 0; i < recordCount; i++)
            {
                this.Records[i] = decodeKey();
            }
        }
예제 #3
0
        protected override ChunkInfo GetChunkInfo(ulong[] chunkIndices)
        {
            if (this.Dataset.InternalFilterPipeline is null)
            {
                if (_btree2_no_filter is null)
                {
                    this.Dataset.Context.Reader.Seek((long)this.Dataset.InternalDataLayout.Address, SeekOrigin.Begin);

                    Func <BTree2Record10> decodeKey
                        = () => this.DecodeRecord10(this.ChunkRank);

                    _btree2_no_filter = new BTree2Header <BTree2Record10>(this.Dataset.Context.Reader, this.Dataset.Context.Superblock, decodeKey);
                }

                // get record
                var success = _btree2_no_filter.TryFindRecord(out var record, record =>
                {
                    // H5Dbtree2.c (H5D__bt2_compare)
                    return(H5Utils.VectorCompare(this.ChunkRank, chunkIndices, record.ScaledOffsets));
                });

                return(success
                    ? new ChunkInfo(record.Address, this.ChunkByteSize, 0)
                    : ChunkInfo.None);
            }
            else
            {
                if (_btree2_filter is null)
                {
                    this.Dataset.Context.Reader.Seek((long)this.Dataset.InternalDataLayout.Address, SeekOrigin.Begin);
                    var chunkSizeLength = H5Utils.ComputeChunkSizeLength(this.ChunkByteSize);

                    Func <BTree2Record11> decodeKey =
                        () => this.DecodeRecord11(this.ChunkRank, chunkSizeLength);

                    _btree2_filter = new BTree2Header <BTree2Record11>(this.Dataset.Context.Reader, this.Dataset.Context.Superblock, decodeKey);
                }

                // get record
                var success = _btree2_filter.TryFindRecord(out var record, record =>
                {
                    // H5Dbtree2.c (H5D__bt2_compare)
                    return(H5Utils.VectorCompare(this.ChunkRank, chunkIndices, record.ScaledOffsets));
                });

                return(success
                    ? new ChunkInfo(record.Address, record.ChunkSize, record.FilterMask)
                    : ChunkInfo.None);
            }
        }
예제 #4
0
        public override T Read <T>(Func <H5BinaryReader, T> func, [AllowNull] ref List <BTree2Record01> record01Cache)
        {
            // huge objects b-tree v2
            if (record01Cache is null)
            {
                _reader.Seek((long)_heapHeader.HugeObjectsBTree2Address, SeekOrigin.Begin);
                var hugeBtree2 = new BTree2Header <BTree2Record01>(_reader, _superblock, this.DecodeRecord01);
                record01Cache = hugeBtree2.EnumerateRecords().ToList();
            }

            var hugeRecord = record01Cache.FirstOrDefault(record => record.HugeObjectId == this.BTree2Key);

            _reader.Seek((long)hugeRecord.HugeObjectAddress, SeekOrigin.Begin);

            return(func(_reader));
        }
예제 #5
0
        private void ReadChunkedBTree2(Span <byte> buffer, byte rank, ulong chunkSize)
        {
            var offset = 0UL;

            if (this.FilterPipeline == null)
            {
                // btree2
                Func <BTree2Record10> decodeKey = () => this.DecodeRecord10(rank);
                var btree2  = new BTree2Header <BTree2Record10>(this.Context.Reader, this.Context.Superblock, decodeKey);
                var records = btree2
                              .EnumerateRecords()
                              .ToList();

                // read data
                foreach (var record in records)
                {
                    this.SeekSliceAndReadChunk(offset, chunkSize, chunkSize, record.Address, buffer);
                    offset += chunkSize;
                }
            }
            else
            {
                // btree2
                var chunkSizeLength             = this.ComputeChunkSizeLength(chunkSize);
                Func <BTree2Record11> decodeKey = () => this.DecodeRecord11(rank, chunkSizeLength);
                var btree2  = new BTree2Header <BTree2Record11>(this.Context.Reader, this.Context.Superblock, decodeKey);
                var records = btree2
                              .EnumerateRecords()
                              .ToList();

                // read data
                foreach (var record in records)
                {
                    this.SeekSliceAndReadChunk(offset, record.ChunkSize, record.ChunkSize, record.Address, buffer);
                    offset += chunkSize;
                }
            }
        }
예제 #6
0
 public BTree2LeafNode(H5BinaryReader reader, BTree2Header <T> header, ushort recordCount, Func <T> decodeKey)
     : base(reader, header, recordCount, BTree2LeafNode <T> .Signature, decodeKey)
 {
     // checksum
     this.Checksum = reader.ReadUInt32();
 }