You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2020/11/02 01:13:01 UTC
[iotdb] branch master updated: [IOTDB-975] Improve
readTimeseriesMetadata (#1909)
This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new ebf63b1 [IOTDB-975] Improve readTimeseriesMetadata (#1909)
ebf63b1 is described below
commit ebf63b12d24412dba2af49dcaf687a6c7d51f232
Author: Zesong Sun <sz...@mails.tsinghua.edu.cn>
AuthorDate: Mon Nov 2 09:12:47 2020 +0800
[IOTDB-975] Improve readTimeseriesMetadata (#1909)
---
.../iotdb/tsfile/read/TsFileSequenceReader.java | 43 ++++++++++++++++------
1 file changed, 31 insertions(+), 12 deletions(-)
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
index 2d3313f..0fa4d5a 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
@@ -24,6 +24,7 @@ import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -330,13 +331,12 @@ public class TsFileSequenceReader implements AutoCloseable {
Pair<MetadataIndexEntry, Long> metadataIndexPair = getMetadataAndEndOffset(
deviceMetadataIndexNode, device, MetadataIndexNodeType.INTERNAL_DEVICE);
List<TimeseriesMetadata> resultTimeseriesMetadataList = new ArrayList<>();
- int maxDegreeOfIndexNode = config.getMaxDegreeOfIndexNode();
- if (measurements.size() > maxDegreeOfIndexNode / Math.log(maxDegreeOfIndexNode)) {
- traverseAndReadTimeseriesMetadataInOneDevice(resultTimeseriesMetadataList,
- MetadataIndexNodeType.INTERNAL_MEASUREMENT, metadataIndexPair, measurements);
- return resultTimeseriesMetadataList;
- }
- for (String measurement : measurements) {
+ List<String> measurementList = new ArrayList<>(measurements);
+ Set<String> measurementsHadFound = new HashSet<>();
+ for (int i = 0; i < measurementList.size(); i++) {
+ if (measurementsHadFound.contains(measurementList.get(i))) {
+ continue;
+ }
ByteBuffer buffer = readData(metadataIndexPair.left.getOffset(), metadataIndexPair.right);
Pair<MetadataIndexEntry, Long> measurementMetadataIndexPair = metadataIndexPair;
List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
@@ -344,22 +344,41 @@ public class TsFileSequenceReader implements AutoCloseable {
if (!metadataIndexNode.getNodeType().equals(MetadataIndexNodeType.LEAF_MEASUREMENT)) {
metadataIndexNode = MetadataIndexNode.deserializeFrom(buffer);
measurementMetadataIndexPair = getMetadataAndEndOffset(metadataIndexNode,
- measurement, MetadataIndexNodeType.INTERNAL_MEASUREMENT);
+ measurementList.get(i), MetadataIndexNodeType.INTERNAL_MEASUREMENT);
}
buffer = readData(measurementMetadataIndexPair.left.getOffset(),
measurementMetadataIndexPair.right);
while (buffer.hasRemaining()) {
timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer));
}
- int searchResult = binarySearchInTimeseriesMetadataList(timeseriesMetadataList,
- measurement);
- if (searchResult >= 0) {
- resultTimeseriesMetadataList.add(timeseriesMetadataList.get(searchResult));
+ for (int j = i; j < measurementList.size(); j++) {
+ String current = measurementList.get(j);
+ if (!measurementsHadFound.contains(current)) {
+ int searchResult = binarySearchInTimeseriesMetadataList(timeseriesMetadataList, current);
+ if (searchResult >= 0) {
+ resultTimeseriesMetadataList.add(timeseriesMetadataList.get(searchResult));
+ measurementsHadFound.add(current);
+ }
+ }
+ if (measurementsHadFound.size() == measurements.size()) {
+ return resultTimeseriesMetadataList;
+ }
}
}
return resultTimeseriesMetadataList;
}
+ /**
+ * Traverse and read TimeseriesMetadata of specific measurements in one device. This method need
+ * to deserialize all TimeseriesMetadata and then judge, in order to avoid frequent I/O when the
+ * number of queried measurements is too large. Attention: This method is not used currently
+ *
+ * @param timeseriesMetadataList TimeseriesMetadata list, to store the result
+ * @param type MetadataIndexNode type
+ * @param metadataIndexPair <MetadataIndexEntry, offset> pair
+ * @param measurements measurements to be queried
+ * @throws IOException io error
+ */
private void traverseAndReadTimeseriesMetadataInOneDevice(
List<TimeseriesMetadata> timeseriesMetadataList, MetadataIndexNodeType type,
Pair<MetadataIndexEntry, Long> metadataIndexPair, Set<String> measurements)