Skip to content

Commit d016239

Browse files
feat: Integrate MemoryReservationManager into percentile accumulators for improved memory management
1 parent 3c1b118 commit d016239

9 files changed

Lines changed: 143 additions & 39 deletions

File tree

‎iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/source/relational/Percentile.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ public void addValue(double value) {
4545
}
4646

4747
public void addValues(double... vals) {
48-
if (vals == null || vals.length == 0) return;
48+
if (vals == null || vals.length == 0) {
49+
return;
50+
}
4951

5052
int newSize = size + vals.length;
5153
if (newSize > capacity) {

‎iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/source/relational/aggregation/AccumulatorFactory.java‎

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.apache.iotdb.calc.execution.operator.source.relational.aggregation.grouped.IntGroupedApproxMostFrequentAccumulator;
5858
import org.apache.iotdb.calc.execution.operator.source.relational.aggregation.grouped.LongGroupedApproxMostFrequentAccumulator;
5959
import org.apache.iotdb.calc.i18n.CalcMessages;
60+
import org.apache.iotdb.calc.plan.planner.memory.MemoryReservationManager;
6061
import org.apache.iotdb.common.rpc.thrift.TAggregationType;
6162
import org.apache.iotdb.commons.queryengine.execution.operator.source.relational.aggregation.grouped.UpdateMemory;
6263
import org.apache.iotdb.commons.queryengine.execution.operator.source.relational.aggregation.grouped.hash.MarkDistinctHash;
@@ -107,7 +108,8 @@ public static TableAccumulator createAccumulator(
107108
boolean isAggTableScan,
108109
String timeColumnName,
109110
Set<String> measurementColumnNames,
110-
boolean distinct) {
111+
boolean distinct,
112+
MemoryReservationManager memoryReservationManager) {
111113
TableAccumulator result;
112114

113115
// Input expression size of 1 indicates aggregation split has occurred and this is a final
@@ -167,7 +169,7 @@ public static TableAccumulator createAccumulator(
167169
? new FirstAccumulator(inputDataTypes.get(0), isAggTableScan)
168170
: new FirstDescAccumulator(inputDataTypes.get(0));
169171
} else {
170-
result = createBuiltinAccumulator(aggregationType, inputDataTypes);
172+
result = createBuiltinAccumulator(aggregationType, inputDataTypes, memoryReservationManager);
171173
}
172174

173175
if (distinct) {
@@ -189,7 +191,8 @@ public static GroupedAccumulator createGroupedAccumulator(
189191
List<Expression> inputExpressions,
190192
Map<String, String> inputAttributes,
191193
boolean ascending,
192-
boolean distinct) {
194+
boolean distinct,
195+
MemoryReservationManager memoryReservationManager) {
193196
GroupedAccumulator result;
194197

195198
if (aggregationType == TAggregationType.UDAF) {
@@ -198,7 +201,12 @@ public static GroupedAccumulator createGroupedAccumulator(
198201
} else {
199202
result =
200203
createBuiltinGroupedAccumulator(
201-
aggregationType, inputDataTypes, inputExpressions, inputAttributes, ascending);
204+
aggregationType,
205+
inputDataTypes,
206+
inputExpressions,
207+
inputAttributes,
208+
ascending,
209+
memoryReservationManager);
202210
}
203211

204212
if (distinct) {
@@ -243,7 +251,8 @@ private static GroupedAccumulator createBuiltinGroupedAccumulator(
243251
List<TSDataType> inputDataTypes,
244252
List<Expression> inputExpressions,
245253
Map<String, String> inputAttributes,
246-
boolean ascending) {
254+
boolean ascending,
255+
MemoryReservationManager memoryReservationManager) {
247256
switch (aggregationType) {
248257
case COUNT:
249258
return new GroupedCountAccumulator();
@@ -328,15 +337,17 @@ private static GroupedAccumulator createBuiltinGroupedAccumulator(
328337
return new GroupedCentralMomentAccumulator(
329338
inputDataTypes.get(0), CentralMomentAccumulator.MomentType.KURTOSIS);
330339
case PERCENTILE:
331-
return new GroupedPercentileAccumulator(inputDataTypes.get(0));
340+
return new GroupedPercentileAccumulator(inputDataTypes.get(0), memoryReservationManager);
332341
default:
333342
throw new IllegalArgumentException(
334343
CalcMessages.INVALID_AGGREGATION_FUNCTION + aggregationType);
335344
}
336345
}
337346

338347
public static TableAccumulator createBuiltinAccumulator(
339-
TAggregationType aggregationType, List<TSDataType> inputDataTypes) {
348+
TAggregationType aggregationType,
349+
List<TSDataType> inputDataTypes,
350+
MemoryReservationManager memoryReservationManager) {
340351
switch (aggregationType) {
341352
case COUNT:
342353
return new CountAccumulator();
@@ -422,7 +433,7 @@ public static TableAccumulator createBuiltinAccumulator(
422433
return new TableCentralMomentAccumulator(
423434
inputDataTypes.get(0), CentralMomentAccumulator.MomentType.KURTOSIS);
424435
case PERCENTILE:
425-
return new PercentileAccumulator(inputDataTypes.get(0));
436+
return new PercentileAccumulator(inputDataTypes.get(0), memoryReservationManager);
426437
default:
427438
throw new IllegalArgumentException(
428439
CalcMessages.INVALID_AGGREGATION_FUNCTION + aggregationType);

‎iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/source/relational/aggregation/PercentileAccumulator.java‎

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package org.apache.iotdb.calc.execution.operator.source.relational.aggregation;
1616

1717
import org.apache.iotdb.calc.execution.operator.source.relational.Percentile;
18+
import org.apache.iotdb.calc.plan.planner.memory.MemoryReservationManager;
1819
import org.apache.iotdb.commons.exception.SemanticException;
1920

2021
import org.apache.tsfile.block.column.Column;
@@ -36,8 +37,14 @@ public class PercentileAccumulator implements TableAccumulator {
3637
private Percentile percentile = new Percentile();
3738
private double percentage;
3839

39-
public PercentileAccumulator(TSDataType seriesDataType) {
40+
private final MemoryReservationManager memoryReservationManager;
41+
private long previousPercentileSize;
42+
43+
public PercentileAccumulator(
44+
TSDataType seriesDataType, MemoryReservationManager memoryReservationManager) {
4045
this.seriesDataType = seriesDataType;
46+
this.memoryReservationManager = memoryReservationManager;
47+
updateMemoryReservation();
4148
}
4249

4350
@Override
@@ -47,7 +54,7 @@ public long getEstimatedSize() {
4754

4855
@Override
4956
public TableAccumulator copy() {
50-
return new PercentileAccumulator(seriesDataType);
57+
return new PercentileAccumulator(seriesDataType, memoryReservationManager);
5158
}
5259

5360
@Override
@@ -60,21 +67,22 @@ public void addInput(Column[] arguments, AggregationMask mask) {
6067
switch (seriesDataType) {
6168
case INT32:
6269
addIntInput(arguments[0], mask);
63-
return;
70+
break;
6471
case INT64:
6572
case TIMESTAMP:
6673
addLongInput(arguments[0], mask);
67-
return;
74+
break;
6875
case FLOAT:
6976
addFloatInput(arguments[0], mask);
70-
return;
77+
break;
7178
case DOUBLE:
7279
addDoubleInput(arguments[0], mask);
73-
return;
80+
break;
7481
default:
7582
throw new UnSupportedDataTypeException(
7683
String.format("Unsupported data type in Percentile Aggregation: %s", seriesDataType));
7784
}
85+
updateMemoryReservation();
7886
}
7987

8088
@Override
@@ -87,6 +95,7 @@ public void addIntermediate(Column argument) {
8795
percentile.merge(Percentile.deserialize(buffer));
8896
}
8997
}
98+
updateMemoryReservation();
9099
}
91100

92101
@Override
@@ -137,7 +146,19 @@ public void addStatistics(Statistics[] statistics) {
137146

138147
@Override
139148
public void reset() {
140-
percentile.clear();
149+
percentile = new Percentile();
150+
updateMemoryReservation();
151+
}
152+
153+
private void updateMemoryReservation() {
154+
long currentSize = percentile.getEstimatedSize();
155+
long delta = currentSize - previousPercentileSize;
156+
if (delta > 0) {
157+
memoryReservationManager.reserveMemoryCumulatively(delta);
158+
} else if (delta < 0) {
159+
memoryReservationManager.releaseMemoryCumulatively(-delta);
160+
}
161+
previousPercentileSize = currentSize;
141162
}
142163

143164
private void addIntInput(Column column, AggregationMask mask) {

‎iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/source/relational/aggregation/grouped/GroupedPercentileAccumulator.java‎

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.apache.iotdb.calc.execution.operator.source.relational.Percentile;
1818
import org.apache.iotdb.calc.execution.operator.source.relational.aggregation.AggregationMask;
1919
import org.apache.iotdb.calc.execution.operator.source.relational.aggregation.grouped.array.PercentileBigArray;
20+
import org.apache.iotdb.calc.plan.planner.memory.MemoryReservationManager;
2021
import org.apache.iotdb.commons.exception.SemanticException;
2122

2223
import org.apache.tsfile.block.column.Column;
@@ -34,10 +35,15 @@ public class GroupedPercentileAccumulator implements GroupedAccumulator {
3435
RamUsageEstimator.shallowSizeOfInstance(GroupedPercentileAccumulator.class);
3536
private final TSDataType seriesDataType;
3637
private double percentage;
38+
private final MemoryReservationManager memoryReservationManager;
39+
private long previousArraySize;
3740
private final PercentileBigArray array = new PercentileBigArray();
3841

39-
public GroupedPercentileAccumulator(TSDataType seriesDataType) {
42+
public GroupedPercentileAccumulator(
43+
TSDataType seriesDataType, MemoryReservationManager memoryReservationManager) {
4044
this.seriesDataType = seriesDataType;
45+
this.memoryReservationManager = memoryReservationManager;
46+
updateMemoryReservation();
4147
}
4248

4349
@Override
@@ -76,6 +82,7 @@ public void addInput(int[] groupIds, Column[] arguments, AggregationMask mask) {
7682
throw new UnSupportedDataTypeException(
7783
String.format("Unsupported data type in PERCENTILE Aggregation: %s", seriesDataType));
7884
}
85+
updateMemoryReservation();
7986
}
8087

8188
@Override
@@ -90,6 +97,7 @@ public void addIntermediate(int[] groupIds, Column argument) {
9097
array.get(groupId).merge(other);
9198
}
9299
}
100+
updateMemoryReservation();
93101
}
94102

95103
@Override
@@ -136,6 +144,18 @@ public void prepareFinal() {}
136144
@Override
137145
public void reset() {
138146
array.reset();
147+
updateMemoryReservation();
148+
}
149+
150+
private void updateMemoryReservation() {
151+
long currentSize = array.sizeOf();
152+
long delta = currentSize - previousArraySize;
153+
if (delta > 0) {
154+
memoryReservationManager.reserveMemoryCumulatively(delta);
155+
} else if (delta < 0) {
156+
memoryReservationManager.releaseMemoryCumulatively(-delta);
157+
}
158+
previousArraySize = currentSize;
139159
}
140160

141161
public void addIntInput(int[] groupIds, Column[] arguments, AggregationMask mask) {

0 commit comments

Comments
 (0)