You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2019/11/22 16:08:45 UTC
[incubator-iotdb] branch dev_new_merge_strategy updated: optimize
cost calculation
This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch dev_new_merge_strategy
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
The following commit(s) were added to refs/heads/dev_new_merge_strategy by this push:
new 3747c79 optimize cost calculation
3747c79 is described below
commit 3747c79820c19a71c4bf4d51a4dcce702e46a8b6
Author: jt2594838 <jt...@163.com>
AuthorDate: Sat Nov 23 00:08:33 2019 +0800
optimize cost calculation
---
.../iotdb/db/engine/merge/BaseFileSelector.java | 1 +
.../squeeze/selector/SqueezeMaxFileSelector.java | 1 +
.../java/org/apache/iotdb/db/utils/MergeUtils.java | 49 ++++++++++------------
3 files changed, 23 insertions(+), 28 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/BaseFileSelector.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/BaseFileSelector.java
index c244a99..4fa0708 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/merge/BaseFileSelector.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/BaseFileSelector.java
@@ -152,6 +152,7 @@ public abstract class BaseFileSelector implements IMergeFileSelector{
long[] chunkNums = MergeUtils.findTotalAndLargestSeriesChunkNum(seqFile, resource.getFileReader(seqFile));
long totalChunkNum = chunkNums[0];
long maxChunkNum = chunkNums[1];
+ logger.debug("File {} has {} chunks, max chunk num {}", seqFile, totalChunkNum, maxChunkNum);
cost = measurement.measure(seqFile) * maxChunkNum / totalChunkNum;
maxSeriesQueryCostMap.put(seqFile, cost);
logger.debug(LOG_FILE_COST, seqFile, cost);
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/squeeze/selector/SqueezeMaxFileSelector.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/squeeze/selector/SqueezeMaxFileSelector.java
index cbf1748..3a5b08e 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/merge/squeeze/selector/SqueezeMaxFileSelector.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/squeeze/selector/SqueezeMaxFileSelector.java
@@ -142,6 +142,7 @@ public class SqueezeMaxFileSelector extends BaseFileSelector {
long fileCost = 0;
long fileReadCost = useTightBound ? calculateTightSeqMemoryCost(seqFile) :
calculateMetadataSize(seqFile);
+ logger.debug("File read cost of {} is {}", seqFile, fileReadCost);
if (fileReadCost > tempMaxSeqFileCost) {
// memory used when read data from a seq file:
// only one file will be read at the same time, so only the largest one is recorded here
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/MergeUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/MergeUtils.java
index 9e01aa6..038c7c6 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/MergeUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/MergeUtils.java
@@ -20,19 +20,13 @@
package org.apache.iotdb.db.utils;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.PriorityQueue;
-import java.util.Set;
+import java.util.*;
+import java.util.function.BiFunction;
+
import org.apache.iotdb.db.engine.merge.manage.MergeResource;
import org.apache.iotdb.db.engine.modification.Modification;
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
-import org.apache.iotdb.tsfile.file.metadata.ChunkMetaData;
-import org.apache.iotdb.tsfile.file.metadata.TsDeviceMetadataIndex;
-import org.apache.iotdb.tsfile.file.metadata.TsFileMetaData;
+import org.apache.iotdb.tsfile.file.metadata.*;
import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
import org.apache.iotdb.tsfile.read.common.BatchData;
import org.apache.iotdb.tsfile.read.common.Chunk;
@@ -76,19 +70,6 @@ public class MergeUtils {
}
}
- private static List<Path> collectFileSeries(TsFileSequenceReader sequenceReader) throws IOException {
- TsFileMetaData metaData = sequenceReader.readFileMetadata();
- Set<String> deviceIds = metaData.getDeviceMap().keySet();
- Set<String> measurements = metaData.getMeasurementSchema().keySet();
- List<Path> paths = new ArrayList<>();
- for (String deviceId : deviceIds) {
- for (String measurement : measurements) {
- paths.add(new Path(deviceId, measurement));
- }
- }
- return paths;
- }
-
public static long collectFileSizes(List<TsFileResource> seqFiles, List<TsFileResource> unseqFiles) {
long totalSize = 0;
for (TsFileResource tsFileResource : seqFiles) {
@@ -144,12 +125,24 @@ public class MergeUtils {
throws IOException {
long totalChunkNum = 0;
long maxChunkNum = Long.MIN_VALUE;
- List<Path> paths = collectFileSeries(sequenceReader);
+ Map<String, Long> seriesChunkNums = new HashMap<>();
+ TsFileMetaData metaData = sequenceReader.readFileMetadata();
+ for (TsDeviceMetadataIndex tsDeviceMetadataIndex : metaData.getDeviceMap().values()) {
+ TsDeviceMetadata deviceMetadata = sequenceReader.readTsDeviceMetaData(tsDeviceMetadataIndex);
+ List<ChunkGroupMetaData> chunkGroupMetaDataList = deviceMetadata.getChunkGroupMetaDataList();
+ if (!chunkGroupMetaDataList.isEmpty()) {
+ String device = chunkGroupMetaDataList.get(0).getDeviceID();
+ for (ChunkGroupMetaData chunkGroupMetaData : chunkGroupMetaDataList) {
+ for (ChunkMetaData chunkMetaData : chunkGroupMetaData.getChunkMetaDataList()) {
+ seriesChunkNums.compute(device + chunkMetaData.getMeasurementUid(), (s, aLong) -> aLong == null ? 1 : aLong + 1);
+ totalChunkNum ++;
+ }
+ }
+ }
+ }
- for (Path path : paths) {
- List<ChunkMetaData> chunkMetaDataList = sequenceReader.getChunkMetadataList(path);
- totalChunkNum += chunkMetaDataList.size();
- maxChunkNum = chunkMetaDataList.size() > maxChunkNum ? chunkMetaDataList.size() : maxChunkNum;
+ for (Map.Entry<String, Long> stringLongEntry : seriesChunkNums.entrySet()) {
+ maxChunkNum = Math.max(maxChunkNum, stringLongEntry.getValue());
}
logger.debug("In file {}, total chunk num {}, series max chunk num {}", tsFileResource,
totalChunkNum, maxChunkNum);