1919
2020package org .apache .iotdb .db .pipe .event .common .tsfile .parser .scan ;
2121
22+ import org .apache .tsfile .compress .IUnCompressor ;
2223import org .apache .tsfile .encoding .decoder .Decoder ;
2324import org .apache .tsfile .encrypt .EncryptParameter ;
2425import org .apache .tsfile .encrypt .IDecryptor ;
3132import org .apache .tsfile .read .reader .chunk .AbstractChunkReader ;
3233import org .apache .tsfile .read .reader .chunk .ChunkReader ;
3334import org .apache .tsfile .read .reader .page .AlignedPageReader ;
35+ import org .apache .tsfile .read .reader .page .LazyLoadPageData ;
3436
3537import java .io .IOException ;
3638import java .io .Serializable ;
4345 * The {@link AlignedSinglePageWholeChunkReader} is used to read a whole single page aligned chunk
4446 * with need to pass in the statistics.
4547 */
46- public class AlignedSinglePageWholeChunkReader extends AbstractChunkReader {
48+ public class AlignedSinglePageWholeChunkReader extends AbstractChunkReader
49+ implements EstimatedMemoryChunkReader {
4750
4851 // chunk header of the time column
4952 private final ChunkHeader timeChunkHeader ;
@@ -58,6 +61,7 @@ public class AlignedSinglePageWholeChunkReader extends AbstractChunkReader {
5861 private final List <ByteBuffer > valueChunkDataBufferList = new ArrayList <>();
5962 // deleted intervals of all the sub sensors
6063 private final List <List <TimeRange >> valueDeleteIntervalsList = new ArrayList <>();
64+ private final long pageEstimatedMemoryUsageInBytes ;
6165
6266 public AlignedSinglePageWholeChunkReader (
6367 Chunk timeChunk , List <Chunk > valueChunkList , LongConsumer filteredRowsRecord )
@@ -66,6 +70,8 @@ public AlignedSinglePageWholeChunkReader(
6670 this .timeChunkHeader = timeChunk .getHeader ();
6771 this .timeChunkDataBuffer = timeChunk .getData ();
6872 this .encryptParam = timeChunk .getEncryptParam ();
73+ this .pageEstimatedMemoryUsageInBytes =
74+ calculatePageEstimatedMemoryUsageInBytes (timeChunk , valueChunkList );
6975
7076 valueChunkList .forEach (
7177 chunk -> {
@@ -133,7 +139,7 @@ private AlignedPageReader constructAlignedPageReader(
133139 timePageHeader , timeChunkDataBuffer , timeChunkHeader , decryptor );
134140
135141 List <PageHeader > valuePageHeaderList = new ArrayList <>();
136- List < ByteBuffer > valuePageDataList = new ArrayList <>() ;
142+ LazyLoadPageData [] valuePageDataArray = new LazyLoadPageData [ rawValuePageHeaderList . size ()] ;
137143 List <TSDataType > valueDataTypeList = new ArrayList <>();
138144 List <Decoder > valueDecoderList = new ArrayList <>();
139145
@@ -144,15 +150,22 @@ private AlignedPageReader constructAlignedPageReader(
144150 if (valuePageHeader == null || valuePageHeader .getUncompressedSize () == 0 ) {
145151 // Empty Page
146152 valuePageHeaderList .add (null );
147- valuePageDataList . add ( null ) ;
153+ valuePageDataArray [ i ] = null ;
148154 valueDataTypeList .add (null );
149155 valueDecoderList .add (null );
150156 } else {
151157 ChunkHeader valueChunkHeader = valueChunkHeaderList .get (i );
158+ int currentPagePosition = valueChunkDataBufferList .get (i ).position ();
159+ valueChunkDataBufferList
160+ .get (i )
161+ .position (currentPagePosition + valuePageHeader .getCompressedSize ());
152162 valuePageHeaderList .add (valuePageHeader );
153- valuePageDataList .add (
154- ChunkReader .deserializePageData (
155- valuePageHeader , valueChunkDataBufferList .get (i ), valueChunkHeader , decryptor ));
163+ valuePageDataArray [i ] =
164+ new LazyLoadPageData (
165+ valueChunkDataBufferList .get (i ).array (),
166+ currentPagePosition ,
167+ IUnCompressor .getUnCompressor (valueChunkHeader .getCompressionType ()),
168+ encryptParam );
156169 valueDataTypeList .add (valueChunkHeader .getDataType ());
157170 valueDecoderList .add (
158171 Decoder .getDecoderByType (
@@ -169,11 +182,38 @@ private AlignedPageReader constructAlignedPageReader(
169182 timePageData ,
170183 defaultTimeDecoder ,
171184 valuePageHeaderList ,
172- valuePageDataList ,
185+ valuePageDataArray ,
173186 valueDataTypeList ,
174187 valueDecoderList ,
175188 queryFilter );
176189 alignedPageReader .setDeleteIntervalList (valueDeleteIntervalsList );
177190 return alignedPageReader ;
178191 }
192+
193+ @ Override
194+ public long getCurrentPageEstimatedMemoryUsageInBytes () {
195+ return pageEstimatedMemoryUsageInBytes ;
196+ }
197+
198+ public static long calculatePageEstimatedMemoryUsageInBytes (
199+ final Chunk timeChunk , final List <Chunk > valueChunkList ) throws IOException {
200+ final ByteBuffer timeChunkDataBuffer = timeChunk .getData ().duplicate ();
201+ long estimatedMemoryUsageInBytes =
202+ PageHeader .deserializeFrom (timeChunkDataBuffer , (Statistics <? extends Serializable >) null )
203+ .getUncompressedSize ();
204+
205+ for (final Chunk valueChunk : valueChunkList ) {
206+ if (valueChunk == null ) {
207+ continue ;
208+ }
209+
210+ final ByteBuffer valueChunkDataBuffer = valueChunk .getData ().duplicate ();
211+ estimatedMemoryUsageInBytes +=
212+ PageHeader .deserializeFrom (
213+ valueChunkDataBuffer , (Statistics <? extends Serializable >) null )
214+ .getUncompressedSize ();
215+ }
216+
217+ return estimatedMemoryUsageInBytes ;
218+ }
179219}
0 commit comments