1919
2020package org .apache .iotdb .db .pipe .event .common .tsfile .container .scan ;
2121
22+ import org .apache .tsfile .compress .IUnCompressor ;
2223import org .apache .tsfile .encoding .decoder .Decoder ;
2324import org .apache .tsfile .enums .TSDataType ;
2425import org .apache .tsfile .file .header .ChunkHeader ;
2930import org .apache .tsfile .read .reader .chunk .AbstractChunkReader ;
3031import org .apache .tsfile .read .reader .chunk .ChunkReader ;
3132import org .apache .tsfile .read .reader .page .AlignedPageReader ;
33+ import org .apache .tsfile .read .reader .page .LazyLoadPageData ;
3234
3335import java .io .IOException ;
3436import java .io .Serializable ;
4042 * The {@link AlignedSinglePageWholeChunkReader} is used to read a whole single page aligned chunk
4143 * with need to pass in the statistics.
4244 */
43- public class AlignedSinglePageWholeChunkReader extends AbstractChunkReader {
45+ public class AlignedSinglePageWholeChunkReader extends AbstractChunkReader
46+ implements EstimatedMemoryChunkReader {
4447
4548 // chunk header of the time column
4649 private final ChunkHeader timeChunkHeader ;
@@ -53,12 +56,15 @@ public class AlignedSinglePageWholeChunkReader extends AbstractChunkReader {
5356 private final List <ByteBuffer > valueChunkDataBufferList = new ArrayList <>();
5457 // deleted intervals of all the sub sensors
5558 private final List <List <TimeRange >> valueDeleteIntervalsList = new ArrayList <>();
59+ private final long pageEstimatedMemoryUsageInBytes ;
5660
5761 public AlignedSinglePageWholeChunkReader (Chunk timeChunk , List <Chunk > valueChunkList )
5862 throws IOException {
5963 super (Long .MIN_VALUE , null );
6064 this .timeChunkHeader = timeChunk .getHeader ();
6165 this .timeChunkDataBuffer = timeChunk .getData ();
66+ this .pageEstimatedMemoryUsageInBytes =
67+ calculatePageEstimatedMemoryUsageInBytes (timeChunk , valueChunkList );
6268
6369 valueChunkList .forEach (
6470 chunk -> {
@@ -124,7 +130,7 @@ private AlignedPageReader constructAlignedPageReader(
124130 ChunkReader .deserializePageData (timePageHeader , timeChunkDataBuffer , timeChunkHeader );
125131
126132 List <PageHeader > valuePageHeaderList = new ArrayList <>();
127- List < ByteBuffer > valuePageDataList = new ArrayList <>() ;
133+ LazyLoadPageData [] valuePageDataArray = new LazyLoadPageData [ rawValuePageHeaderList . size ()] ;
128134 List <TSDataType > valueDataTypeList = new ArrayList <>();
129135 List <Decoder > valueDecoderList = new ArrayList <>();
130136
@@ -135,15 +141,21 @@ private AlignedPageReader constructAlignedPageReader(
135141 if (valuePageHeader == null || valuePageHeader .getUncompressedSize () == 0 ) {
136142 // Empty Page
137143 valuePageHeaderList .add (null );
138- valuePageDataList . add ( null ) ;
144+ valuePageDataArray [ i ] = null ;
139145 valueDataTypeList .add (null );
140146 valueDecoderList .add (null );
141147 } else {
142148 ChunkHeader valueChunkHeader = valueChunkHeaderList .get (i );
149+ int currentPagePosition = valueChunkDataBufferList .get (i ).position ();
150+ valueChunkDataBufferList
151+ .get (i )
152+ .position (currentPagePosition + valuePageHeader .getCompressedSize ());
143153 valuePageHeaderList .add (valuePageHeader );
144- valuePageDataList .add (
145- ChunkReader .deserializePageData (
146- valuePageHeader , valueChunkDataBufferList .get (i ), valueChunkHeader ));
154+ valuePageDataArray [i ] =
155+ new LazyLoadPageData (
156+ valueChunkDataBufferList .get (i ).array (),
157+ currentPagePosition ,
158+ IUnCompressor .getUnCompressor (valueChunkHeader .getCompressionType ()));
147159 valueDataTypeList .add (valueChunkHeader .getDataType ());
148160 valueDecoderList .add (
149161 Decoder .getDecoderByType (
@@ -160,11 +172,38 @@ private AlignedPageReader constructAlignedPageReader(
160172 timePageData ,
161173 defaultTimeDecoder ,
162174 valuePageHeaderList ,
163- valuePageDataList ,
175+ valuePageDataArray ,
164176 valueDataTypeList ,
165177 valueDecoderList ,
166178 queryFilter );
167179 alignedPageReader .setDeleteIntervalList (valueDeleteIntervalsList );
168180 return alignedPageReader ;
169181 }
182+
183+ @ Override
184+ public long getCurrentPageEstimatedMemoryUsageInBytes () {
185+ return pageEstimatedMemoryUsageInBytes ;
186+ }
187+
188+ public static long calculatePageEstimatedMemoryUsageInBytes (
189+ final Chunk timeChunk , final List <Chunk > valueChunkList ) throws IOException {
190+ final ByteBuffer timeChunkDataBuffer = timeChunk .getData ().duplicate ();
191+ long estimatedMemoryUsageInBytes =
192+ PageHeader .deserializeFrom (timeChunkDataBuffer , (Statistics <? extends Serializable >) null )
193+ .getUncompressedSize ();
194+
195+ for (final Chunk valueChunk : valueChunkList ) {
196+ if (valueChunk == null ) {
197+ continue ;
198+ }
199+
200+ final ByteBuffer valueChunkDataBuffer = valueChunk .getData ().duplicate ();
201+ estimatedMemoryUsageInBytes +=
202+ PageHeader .deserializeFrom (
203+ valueChunkDataBuffer , (Statistics <? extends Serializable >) null )
204+ .getUncompressedSize ();
205+ }
206+
207+ return estimatedMemoryUsageInBytes ;
208+ }
170209}
0 commit comments