Skip to content

Commit 0ebdb87

Browse files
Caideyipijt2594838
andauthored
Pipe: improved the memory calculation for tablets (apache#16739)
* fix * fix * opti * fix * fix * fix function name * fix * fix * fix ut --------- Co-authored-by: Tian Jiang <[email protected]>
1 parent 0e209e7 commit 0ebdb87

File tree

8 files changed

+17
-111
lines changed

8 files changed

+17
-111
lines changed

integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1630,6 +1630,7 @@ public void insertRelationalTabletWithAutoCastTest()
16301630
Collections.addAll(dataTypes, TSDataType.values());
16311631
dataTypes.remove(TSDataType.VECTOR);
16321632
dataTypes.remove(TSDataType.UNKNOWN);
1633+
dataTypes.remove(TSDataType.OBJECT);
16331634

16341635
try {
16351636
for (TSDataType from : dataTypes) {
@@ -1720,6 +1721,7 @@ public void insertRelationalRowWithAutoCastTest()
17201721
Collections.addAll(dataTypes, TSDataType.values());
17211722
dataTypes.remove(TSDataType.VECTOR);
17221723
dataTypes.remove(TSDataType.UNKNOWN);
1724+
dataTypes.remove(TSDataType.OBJECT);
17231725

17241726
for (TSDataType from : dataTypes) {
17251727
for (TSDataType to : dataTypes) {

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/resource/memory/InsertNodeMemoryEstimator.java

Lines changed: 7 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ private static long calculateFullInsertNodeSize(final InsertNode node) {
189189
// MeasurementSchemas
190190
size += sizeOfMeasurementSchemas(node.getMeasurementSchemas());
191191
// Measurement
192-
size += sizeOfStringArray(node.getMeasurements());
192+
size += RamUsageEstimator.sizeOf(node.getMeasurements());
193193
// dataTypes
194194
size += RamUsageEstimator.shallowSizeOf(node.getDataTypes());
195195
// columnCategories
@@ -231,7 +231,7 @@ private static long sizeOfInsertTabletNode(final InsertTabletNode node) {
231231
long size = INSERT_TABLET_NODE_SIZE;
232232
size += calculateFullInsertNodeSize(node);
233233
size += RamUsageEstimator.sizeOf(node.getTimes());
234-
size += sizeOfBitMapArray(node.getBitMaps());
234+
size += RamUsageEstimator.sizeOf(node.getBitMaps());
235235
size += sizeOfColumns(node.getColumns(), node.getMeasurementSchemas());
236236
final List<Integer> range = node.getRange();
237237
if (range != null) {
@@ -247,7 +247,7 @@ private static long calculateInsertTabletNodeSizeExcludingSchemas(final InsertTa
247247

248248
size += RamUsageEstimator.sizeOf(node.getTimes());
249249

250-
size += sizeOfBitMapArray(node.getBitMaps());
250+
size += RamUsageEstimator.sizeOf(node.getBitMaps());
251251

252252
size += sizeOfColumns(node.getColumns(), node.getMeasurementSchemas());
253253

@@ -390,7 +390,7 @@ private static long sizeOfRelationalInsertTabletNode(final RelationalInsertTable
390390

391391
size += RamUsageEstimator.sizeOf(node.getTimes());
392392

393-
size += sizeOfBitMapArray(node.getBitMaps());
393+
size += RamUsageEstimator.sizeOf(node.getBitMaps());
394394

395395
size += sizeOfColumns(node.getColumns(), node.getMeasurementSchemas());
396396

@@ -413,7 +413,7 @@ public static long sizeOfPartialPath(final PartialPath partialPath) {
413413
if (nodes != null) {
414414
// Since fullPath may be lazy loaded, lazy loading will not be triggered here, so it is
415415
// assumed that the memory size of fullPath is the same as that of nodes.
416-
size += sizeOfStringArray(nodes) * 2;
416+
size += RamUsageEstimator.sizeOf(nodes) * 2;
417417
size += TsFileConstant.PATH_SEPARATOR.length() * (nodes.length - 1) + NUM_BYTES_OBJECT_HEADER;
418418
}
419419
return size;
@@ -555,34 +555,6 @@ private static long sizeOfBinary(final Binary binary) {
555555
return Objects.nonNull(binary) ? binary.ramBytesUsed() : 0L;
556556
}
557557

558-
public static long sizeOfStringArray(final String[] values) {
559-
return Objects.nonNull(values) ? RamUsageEstimator.sizeOf(values) : 0L;
560-
}
561-
562-
public static long sizeOfBitMapArray(BitMap[] bitMaps) {
563-
if (bitMaps == null) {
564-
return 0L;
565-
}
566-
long size =
567-
RamUsageEstimator.alignObjectSize(
568-
NUM_BYTES_ARRAY_HEADER + NUM_BYTES_OBJECT_REF * bitMaps.length);
569-
for (BitMap bitMap : bitMaps) {
570-
size += sizeOfBitMap(bitMap);
571-
}
572-
return size;
573-
}
574-
575-
private static long sizeOfBitMap(final BitMap bitMaps) {
576-
if (bitMaps == null) {
577-
return 0L;
578-
}
579-
long size = BIT_MAP_SIZE;
580-
581-
size +=
582-
RamUsageEstimator.alignObjectSize(NUM_BYTES_ARRAY_HEADER + bitMaps.getByteArray().length);
583-
return size;
584-
}
585-
586558
public static long sizeOfColumns(
587559
final Object[] columns, final MeasurementSchema[] measurementSchemas) {
588560
// Directly calculate if measurementSchemas are absent
@@ -631,7 +603,7 @@ public static long sizeOfColumns(
631603
case TEXT:
632604
case BLOB:
633605
{
634-
size += getBinarySize((Binary[]) columns[i]);
606+
size += RamUsageEstimator.sizeOf((Binary[]) columns[i]);
635607
break;
636608
}
637609
}
@@ -641,23 +613,10 @@ public static long sizeOfColumns(
641613

642614
private static long getNumBytesUnknownObject(final Object obj) {
643615
return obj instanceof Binary[]
644-
? getBinarySize((Binary[]) obj)
616+
? RamUsageEstimator.sizeOf((Binary[]) obj)
645617
: RamUsageEstimator.sizeOfObject(obj);
646618
}
647619

648-
private static long getBinarySize(final Binary[] binaries) {
649-
if (binaries == null) {
650-
return 0L;
651-
}
652-
653-
long size = 0L;
654-
for (Binary binary : binaries) {
655-
size += InsertNodeMemoryEstimator.sizeOfBinary(binary);
656-
}
657-
658-
return size + RamUsageEstimator.shallowSizeOf(binaries);
659-
}
660-
661620
public static long sizeOfValues(
662621
final Object[] values, final MeasurementSchema[] measurementSchemas) {
663622
// Directly calculate if measurementSchemas are absent

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryWeightUtil.java

Lines changed: 3 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.apache.tsfile.read.common.Field;
3636
import org.apache.tsfile.read.common.RowRecord;
3737
import org.apache.tsfile.utils.Binary;
38-
import org.apache.tsfile.utils.BitMap;
3938
import org.apache.tsfile.utils.Pair;
4039
import org.apache.tsfile.utils.TsPrimitiveType;
4140
import org.apache.tsfile.write.record.Tablet;
@@ -44,6 +43,7 @@
4443

4544
import java.util.List;
4645
import java.util.Map;
46+
import java.util.Objects;
4747

4848
import static org.apache.tsfile.utils.RamUsageEstimator.NUM_BYTES_ARRAY_HEADER;
4949
import static org.apache.tsfile.utils.RamUsageEstimator.NUM_BYTES_OBJECT_REF;
@@ -203,64 +203,8 @@ private static Pair<Integer, Integer> calculateTabletRowCountAndMemoryBySize(
203203
}
204204
}
205205

206-
public static long calculateTabletSizeInBytes(Tablet tablet) {
207-
long totalSizeInBytes = 0;
208-
209-
if (tablet == null) {
210-
return totalSizeInBytes;
211-
}
212-
213-
long[] timestamps = tablet.getTimestamps();
214-
Object[] tabletValues = tablet.getValues();
215-
216-
// timestamps
217-
if (timestamps != null) {
218-
totalSizeInBytes += timestamps.length * 8L;
219-
}
220-
221-
// values
222-
final List<IMeasurementSchema> timeseries = tablet.getSchemas();
223-
if (timeseries != null) {
224-
for (int column = 0; column < timeseries.size(); column++) {
225-
final IMeasurementSchema measurementSchema = timeseries.get(column);
226-
if (measurementSchema == null) {
227-
continue;
228-
}
229-
230-
final TSDataType tsDataType = measurementSchema.getType();
231-
if (tsDataType == null) {
232-
continue;
233-
}
234-
235-
if (tsDataType.isBinary()) {
236-
if (tabletValues == null || tabletValues.length <= column) {
237-
continue;
238-
}
239-
final Binary[] values = ((Binary[]) tabletValues[column]);
240-
if (values == null) {
241-
continue;
242-
}
243-
for (Binary value : values) {
244-
totalSizeInBytes += value == null ? 8 : value.ramBytesUsed();
245-
}
246-
} else {
247-
totalSizeInBytes += (long) tablet.getMaxRowNumber() * tsDataType.getDataTypeSize();
248-
}
249-
}
250-
}
251-
252-
// bitMaps
253-
BitMap[] bitMaps = tablet.getBitMaps();
254-
if (bitMaps != null) {
255-
for (int i = 0; i < bitMaps.length; i++) {
256-
totalSizeInBytes += bitMaps[i] == null ? 0 : bitMaps[i].getSize();
257-
}
258-
}
259-
260-
// estimate other dataStructures size
261-
totalSizeInBytes += 100;
262-
263-
return totalSizeInBytes;
206+
public static long calculateTabletSizeInBytes(final Tablet tablet) {
207+
return Objects.nonNull(tablet) ? tablet.ramBytesUsed() : 0L;
264208
}
265209

266210
public static long calculateTableSchemaBytesUsed(TableSchema tableSchema) {

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ public long ramBytesUsed() {
686686
ramBytesUsed =
687687
InsertNodeMemoryEstimator.sizeOfPartialPath(devicePath)
688688
+ InsertNodeMemoryEstimator.sizeOfMeasurementSchemas(measurementSchemas)
689-
+ InsertNodeMemoryEstimator.sizeOfStringArray(measurements)
689+
+ RamUsageEstimator.sizeOf(measurements)
690690
+ RamUsageEstimator.shallowSizeOf(dataTypes)
691691
+ RamUsageEstimator.shallowSizeOf(columnCategories)
692692
// We assume that the integers are all cached by JVM

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertTabletStatement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ public void swapColumn(int src, int target) {
615615
protected long calculateBytesUsed() {
616616
return INSTANCE_SIZE
617617
+ RamUsageEstimator.sizeOf(times)
618-
+ InsertNodeMemoryEstimator.sizeOfBitMapArray(nullBitMaps)
618+
+ RamUsageEstimator.sizeOf(nullBitMaps)
619619
+ InsertNodeMemoryEstimator.sizeOfColumns(columns, measurementSchemas)
620620
+ (Objects.nonNull(deviceIDs)
621621
? Arrays.stream(deviceIDs)

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/memory/PrimitiveArrayManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ private static Object createPrimitiveArray(TSDataType dataType) {
249249
case TEXT:
250250
case STRING:
251251
case BLOB:
252+
case OBJECT:
252253
dataArray = new Binary[ARRAY_SIZE];
253254
break;
254255
default:

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/datastructure/TVList.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -970,7 +970,7 @@ public TsBlock nextBatch() {
970970
TSDataType dataType = getDataType();
971971
int maxRowCountOfCurrentBatch =
972972
Math.min(
973-
paginationController.hasLimit()
973+
paginationController.hasSetLimit()
974974
? (int) paginationController.getCurLimit()
975975
: Integer.MAX_VALUE,
976976
Math.min(maxNumberOfPointsInPage, rows - index));

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@
173173
<thrift.version>0.14.1</thrift.version>
174174
<xz.version>1.9</xz.version>
175175
<zstd-jni.version>1.5.6-3</zstd-jni.version>
176-
<tsfile.version>2.2.0-251027-SNAPSHOT</tsfile.version>
176+
<tsfile.version>2.2.0-251113-SNAPSHOT</tsfile.version>
177177
</properties>
178178
<!--
179179
if we claim dependencies in dependencyManagement, then we do not claim

0 commit comments

Comments
 (0)