This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch tsFile_v4
in repository https://gitbox.apache.org/repos/asf/tsfile.git
The following commit(s) were added to refs/heads/tsFile_v4 by this push:
new a3cb8ed5 fix perf test
a3cb8ed5 is described below
commit a3cb8ed5f97e96f96e85ff67b1b85dfea2620048
Author: jt2594838 <[email protected]>
AuthorDate: Tue Apr 16 12:01:04 2024 +0800
fix perf test
---
.../apache/tsfile/common/conf/TSFileConfig.java | 2 +-
.../java/org/apache/tsfile/write/TsFileWriter.java | 2 +-
.../apache/tsfile/tableview/PerformanceTest.java | 198 +++++++++++++++++----
3 files changed, 167 insertions(+), 35 deletions(-)
diff --git
a/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
b/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
index 3c0a69f1..23c68b0a 100644
--- a/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
+++ b/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
@@ -74,7 +74,7 @@ public class TSFileConfig implements Serializable {
/** The primitive array capacity threshold. */
public static final int ARRAY_CAPACITY_THRESHOLD = 1000;
// TODO: configurable but unchangeable
- public static final int DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME = 3;
+ public static int DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME = 3;
/** Memory size threshold for flushing to disk, default value is 128MB. */
private int groupSizeInByte = 128 * 1024 * 1024;
/** The memory size for each series writer to pack page, default value is
64KB. */
diff --git a/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
b/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
index 0ae5099f..77be8e9f 100644
--- a/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
+++ b/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
@@ -367,7 +367,7 @@ public class TsFileWriter implements AutoCloseable {
checkIsAllMeasurementsInGroup(measurementGroup, schemas, isAligned);
groupWriter.tryToAddSeriesWriter(schemas);
} else {
- throw new NoMeasurementException("input devicePath is invalid: " +
deviceID);
+ throw new NoDeviceException(deviceID.toString());
}
}
diff --git
a/tsfile/src/test/java/org/apache/tsfile/tableview/PerformanceTest.java
b/tsfile/src/test/java/org/apache/tsfile/tableview/PerformanceTest.java
index 97d4b393..c2f2ffb1 100644
--- a/tsfile/src/test/java/org/apache/tsfile/tableview/PerformanceTest.java
+++ b/tsfile/src/test/java/org/apache/tsfile/tableview/PerformanceTest.java
@@ -19,17 +19,37 @@
package org.apache.tsfile.tableview;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.stream.Collectors;
+import org.apache.tsfile.common.conf.TSFileConfig;
+import org.apache.tsfile.common.constant.TsFileConstant;
import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.exception.read.ReadProcessException;
import org.apache.tsfile.exception.write.WriteProcessException;
import org.apache.tsfile.file.metadata.IDeviceID;
+import org.apache.tsfile.file.metadata.IDeviceID.Factory;
import org.apache.tsfile.file.metadata.StringArrayDeviceID;
import org.apache.tsfile.file.metadata.TableSchema;
import org.apache.tsfile.file.metadata.enums.CompressionType;
import org.apache.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.tsfile.read.TsFileSequenceReader;
+import org.apache.tsfile.read.common.Path;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.controller.CachedChunkLoaderImpl;
+import org.apache.tsfile.read.controller.MetadataQuerierByFileImpl;
+import org.apache.tsfile.read.expression.QueryExpression;
+import org.apache.tsfile.read.query.dataset.QueryDataSet;
+import org.apache.tsfile.read.query.executor.QueryExecutor;
+import org.apache.tsfile.read.query.executor.TableQueryExecutor;
+import
org.apache.tsfile.read.query.executor.TableQueryExecutor.TableQueryOrdering;
+import org.apache.tsfile.read.query.executor.TsFileExecutor;
+import org.apache.tsfile.read.reader.block.TsBlockReader;
import org.apache.tsfile.utils.Binary;
import org.apache.tsfile.write.TsFileWriter;
import org.apache.tsfile.write.record.Tablet;
@@ -43,18 +63,46 @@ public class PerformanceTest {
private final int idSchemaCnt = 3;
private final int measurementSchemaCnt = 100;
private final int tableCnt = 100;
- private final int devicePerTable = 100;
+ private final int devicePerTable = 10;
private final int pointPerSeries = 100;
private final int tabletCnt = 10;
private List<IMeasurementSchema> idSchemas;
private List<IMeasurementSchema> measurementSchemas;
+ public static void main(String[] args) throws Exception{
+ final PerformanceTest test = new PerformanceTest();
+ test.initSchemas();
+
+ for (int i = 0; i < 10; i++) {
+ test.testTable();
+// test.testTree();
+ }
+ }
+
+ private void initSchemas() {
+ idSchemas = new ArrayList<>(idSchemaCnt);
+ for (int i = 0; i < idSchemaCnt; i++) {
+ idSchemas.add(new MeasurementSchema(
+ "id" + i, TSDataType.TEXT, TSEncoding.PLAIN,
CompressionType.UNCOMPRESSED));
+ }
+
+ measurementSchemas = new ArrayList<>();
+ for (int i = 0; i < measurementSchemaCnt; i++) {
+ measurementSchemas.add(new MeasurementSchema(
+ "s" + i, TSDataType.INT64, TSEncoding.GORILLA, CompressionType.LZ4));
+ }
+ }
+
private void testTree() throws IOException, WriteProcessException {
long registerTimeSum = 0;
long writeTimeSum = 0;
+ long closeTimeSum = 0;
+ long queryTimeSum = 0;
long startTime;
- try (TsFileWriter tsFileWriter = initTsFileWriter()) {
+ final File file = initFile();
+ TsFileWriter tsFileWriter = new TsFileWriter(file);
+ try {
startTime = System.nanoTime();
registerTree(tsFileWriter);
registerTimeSum = System.nanoTime() - startTime;
@@ -62,23 +110,116 @@ public class PerformanceTest {
for (int tableNum = 0; tableNum < tableCnt; tableNum++) {
for (int deviceNum = 0; deviceNum < devicePerTable; deviceNum++) {
for (int tabletNum = 0; tabletNum < tabletCnt; tabletNum++) {
- fillTreeTablet(tablet, tabletNum, deviceNum, tabletNum);
+ fillTreeTablet(tablet, tableNum, deviceNum, tabletNum);
+ startTime = System.nanoTime();
+ tsFileWriter.writeAligned(tablet);
+ writeTimeSum += System.nanoTime() - startTime;
+ }
+ }
+ }
+ } finally {
+ startTime = System.nanoTime();
+ tsFileWriter.close();
+ closeTimeSum = System.nanoTime() - startTime;
+ }
+ long fileSize = file.length();
+
+ startTime = System.nanoTime();
+ try (TsFileSequenceReader sequenceReader =
+ new TsFileSequenceReader(file.getAbsolutePath())) {
+ QueryExecutor queryExecutor =
+ new TsFileExecutor(
+ new MetadataQuerierByFileImpl(sequenceReader),
+ new CachedChunkLoaderImpl(sequenceReader));
+
+ List<Path> selectedSeries = new ArrayList<>();
+ for (int i = 0; i < measurementSchemaCnt; i++) {
+ for (int j = 0; j < devicePerTable; j++) {
+ selectedSeries.add(new Path(genTreeDeviceId(tableCnt / 2, j), "s" +
i,
+ false));
+ }
+ }
+ final QueryExpression queryExpression =
QueryExpression.create(selectedSeries, null);
+ final QueryDataSet queryDataSet = queryExecutor.execute(queryExpression);
+ int cnt = 0;
+ while (queryDataSet.hasNext()) {
+ queryDataSet.next();
+ cnt++;
+ }
+ }
+ queryTimeSum = System.nanoTime() - startTime;
+ file.delete();
+
+ System.out.printf("Tree register %dns, write %dns, close %dns, query %dns,
fileSize %d %n",
+ registerTimeSum,
+ writeTimeSum, closeTimeSum, queryTimeSum, fileSize);
+ }
+
+ private void testTable() throws IOException,
+ WriteProcessException, ReadProcessException {
+ long registerTimeSum = 0;
+ long writeTimeSum = 0;
+ long closeTimeSum = 0;
+ long queryTimeSum = 0;
+ long startTime;
+ final File file = initFile();
+ TsFileWriter tsFileWriter = new TsFileWriter(file);
+ try {
+ startTime = System.nanoTime();
+ registerTable(tsFileWriter);
+ registerTimeSum = System.nanoTime() - startTime;
+ Tablet tablet = initTableTablet();
+ for (int tableNum = 0; tableNum < tableCnt; tableNum++) {
+ for (int deviceNum = 0; deviceNum < devicePerTable; deviceNum++) {
+ for (int tabletNum = 0; tabletNum < tabletCnt; tabletNum++) {
+ fillTableTablet(tablet, tableNum, deviceNum, tabletNum);
startTime = System.nanoTime();
- tsFileWriter.write(tablet);
+ tsFileWriter.writeTable(tablet);
writeTimeSum += System.nanoTime() - startTime;
}
}
}
+ } finally {
+ startTime = System.nanoTime();
+ tsFileWriter.close();
+ closeTimeSum = System.nanoTime() - startTime;
+ }
+ long fileSize = file.length();
+
+ startTime = System.nanoTime();
+ try (TsFileSequenceReader sequenceReader =
+ new TsFileSequenceReader(file.getAbsolutePath())) {
+ TableQueryExecutor tableQueryExecutor =
+ new TableQueryExecutor(
+ new MetadataQuerierByFileImpl(sequenceReader),
+ new CachedChunkLoaderImpl(sequenceReader),
+ TableQueryOrdering.DEVICE);
+
+ List<String> columns =
+ measurementSchemas.stream()
+ .map(IMeasurementSchema::getMeasurementId)
+ .collect(Collectors.toList());
+ TsBlockReader reader =
+ tableQueryExecutor.query(genTableName(tableCnt / 2), columns, null,
null, null);
+ assertTrue(reader.hasNext());
+ int cnt = 0;
+ while (reader.hasNext()) {
+ final TsBlock result = reader.next();
+ cnt += result.getPositionCount();
+ }
}
+ file.delete();
+ queryTimeSum = System.nanoTime() - startTime;
- System.out.printf("Tree register {}ns, ");
+ System.out.printf("Table register %dns, write %dns, close %dns, query
%dns, fileSize %d %n",
+ registerTimeSum,
+ writeTimeSum, closeTimeSum, queryTimeSum, fileSize);
}
- private TsFileWriter initTsFileWriter() throws IOException {
+ private File initFile() throws IOException {
File dir = new File(testDir);
dir.mkdirs();
- File tsFile = new File(dir, "testTsFile");
- return new TsFileWriter(tsFile);
+ return new File(dir, "testTsFile");
}
private Tablet initTreeTablet() {
@@ -86,7 +227,7 @@ public class PerformanceTest {
}
private void fillTreeTablet(Tablet tablet, int tableNum, int deviceNum, int
tabletNum) {
- tablet.insertTargetName = genDeviceId(tableNum, deviceNum).toString();
+ tablet.insertTargetName = genTreeDeviceId(tableNum, deviceNum).toString();
for (int i = 0; i < measurementSchemaCnt; i++) {
long[] values = (long[]) tablet.values[i];
for (int valNum = 0; valNum < pointPerSeries; valNum++) {
@@ -96,16 +237,19 @@ public class PerformanceTest {
for (int valNum = 0; valNum < pointPerSeries; valNum++) {
tablet.timestamps[valNum] = (long) tabletNum * pointPerSeries + valNum;
}
+ tablet.rowSize = pointPerSeries;
}
private Tablet initTableTablet() {
List<IMeasurementSchema> allSchema = new ArrayList<>(idSchemas);
+ List<ColumnType> columnTypes = ColumnType.nCopy(ColumnType.ID,
idSchemas.size());
allSchema.addAll(measurementSchemas);
- return new Tablet(null, allSchema, pointPerSeries);
+ columnTypes.addAll(ColumnType.nCopy(ColumnType.MEASUREMENT,
measurementSchemaCnt));
+ return new Tablet(null, allSchema, columnTypes, pointPerSeries);
}
private void fillTableTablet(Tablet tablet, int tableNum, int deviceNum, int
tabletNum) {
- IDeviceID deviceID = genDeviceId(tableNum, deviceNum);
+ IDeviceID deviceID = genTableDeviceId(tableNum, deviceNum);
tablet.insertTargetName = deviceID.segment(0).toString();
for (int i = 0; i < idSchemaCnt; i++) {
Binary[] binaries = ((Binary[]) tablet.values[i]);
@@ -122,38 +266,22 @@ public class PerformanceTest {
for (int valNum = 0; valNum < pointPerSeries; valNum++) {
tablet.timestamps[valNum] = (long) tabletNum * pointPerSeries + valNum;
}
+ tablet.rowSize = pointPerSeries;
}
private void registerTree(TsFileWriter writer) throws WriteProcessException {
for (int tableNum = 0; tableNum < tableCnt; tableNum++) {
for (int deviceNum = 0; deviceNum < devicePerTable; deviceNum++) {
- for (int measurementNum = 0; measurementNum < measurementSchemaCnt;
measurementNum++) {
- writer.registerTimeseries(genDeviceId(tableNum, deviceNum),
genMeasurementSchema(measurementNum));
- }
+ writer.registerAlignedTimeseries(genTreeDeviceId(tableNum, deviceNum),
measurementSchemas);
}
}
}
private IMeasurementSchema genMeasurementSchema(int measurementNum) {
- if (measurementSchemas == null) {
- measurementSchemas = new ArrayList<>();
- for (int i = 0; i < measurementSchemaCnt; i++) {
- measurementSchemas.add(new MeasurementSchema(
- "s" + measurementNum, TSDataType.INT64, TSEncoding.GORILLA,
CompressionType.LZ4));
- }
- }
-
return measurementSchemas.get(measurementNum);
}
private IMeasurementSchema genIdSchema(int idNum) {
- if (idSchemas == null) {
- idSchemas = new ArrayList<>(idSchemaCnt);
- for (int i = 0; i < idSchemaCnt; i++) {
- idSchemas.add(new MeasurementSchema(
- "id" + i, TSDataType.TEXT, TSEncoding.PLAIN,
CompressionType.UNCOMPRESSED));
- }
- }
return idSchemas.get(idNum);
}
@@ -161,16 +289,20 @@ public class PerformanceTest {
return "table_" + tableNum;
}
- private IDeviceID genDeviceId(int tableNum, int deviceNum) {
+ private IDeviceID genTableDeviceId(int tableNum, int deviceNum) {
String[] idSegments = new String[idSchemaCnt + 1];
idSegments[0] = genTableName(tableNum);
- for (int i = 0; i < idSchemaCnt - 1; i++) {
+ for (int i = 0; i < idSchemaCnt; i++) {
idSegments[i + 1] = "0";
}
- idSegments[idSchemaCnt - 1] = Integer.toString(deviceNum);
+ idSegments[idSchemaCnt] = Integer.toString(deviceNum);
return new StringArrayDeviceID(idSegments);
}
+ private IDeviceID genTreeDeviceId(int tableNum, int deviceNum) {
+ return Factory.DEFAULT_FACTORY.create(genTableDeviceId(tableNum,
deviceNum).toString());
+ }
+
private void registerTable(TsFileWriter writer) {
for (int i = 0; i < tableCnt; i++) {
TableSchema tableSchema = genTableSchema(i);
@@ -190,7 +322,7 @@ public class PerformanceTest {
measurementSchemas.add(genMeasurementSchema(i));
columnTypes.add(ColumnType.MEASUREMENT);
}
- return new TableSchema("testTable" + tableNum, measurementSchemas,
columnTypes);
+ return new TableSchema(genTableName(tableNum), measurementSchemas,
columnTypes);
}
}