未验证 提交 e0a9f0a7 编写于 作者: J Jialin Qiao 提交者: GitHub

adjust ChunkMetadata size in run time (#1045)

上级 3e300693
......@@ -92,7 +92,7 @@ public class IoTDBConfigDynamicAdapter implements IDynamicAdapter {
/**
* Metadata size of per chunk, the default value is 1.5 KB.
*/
private static final long CHUNK_METADATA_SIZE_IN_BYTE = 1536L;
private static long CHUNK_METADATA_SIZE_IN_BYTE = 1536L;
/**
* Average queue length in memtable pool
......@@ -265,6 +265,11 @@ public class IoTDBConfigDynamicAdapter implements IDynamicAdapter {
return totalStorageGroup;
}
public static void setChunkMetadataSizeInByte(long chunkMetadataSizeInByte) {
CHUNK_METADATA_SIZE_IN_BYTE = chunkMetadataSizeInByte;
}
/**
* Only for test
*/
......
......@@ -64,7 +64,7 @@ public class ChunkCache {
long currentSize = RamUsageEstimator.shallowSizeOf(key) + RamUsageEstimator.sizeOf(value);
averageSize = (averageSize * count) + currentSize / (++count);
return currentSize;
} else if (count < 10000) {
} else if (count < 100000) {
count++;
return averageSize;
} else {
......
......@@ -27,6 +27,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBConstant;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.conf.adapter.IoTDBConfigDynamicAdapter;
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
import org.apache.iotdb.db.query.control.FileReaderManager;
import org.apache.iotdb.db.utils.FileLoaderUtils;
......@@ -60,19 +61,31 @@ public class ChunkMetadataCache {
private AtomicLong cacheHitNum = new AtomicLong();
private AtomicLong cacheRequestNum = new AtomicLong();
/**
* approximate estimation of chunkMetaData size
*/
private long chunkMetaDataSize = 0;
private ChunkMetadataCache(long memoryThreshold) {
lruCache = new LRULinkedHashMap<String, List<ChunkMetadata>>(memoryThreshold, true) {
int count = 0;
long averageChunkMetadataSize = 0;
@Override
protected long calEntrySize(String key, List<ChunkMetadata> value) {
if (chunkMetaDataSize == 0 && !value.isEmpty()) {
chunkMetaDataSize = RamUsageEstimator.sizeOf(value.get(0));
if (value.isEmpty()) {
return key.getBytes().length + averageChunkMetadataSize * value.size();
}
if (count < 10) {
long currentSize = RamUsageEstimator.sizeOf(value.get(0));
averageChunkMetadataSize = ((averageChunkMetadataSize * count) + currentSize) / (++count);
IoTDBConfigDynamicAdapter.setChunkMetadataSizeInByte(averageChunkMetadataSize);
return key.getBytes().length + currentSize * value.size();
} else if (count < 100000) {
count++;
return key.getBytes().length + averageChunkMetadataSize * value.size();
} else {
averageChunkMetadataSize = RamUsageEstimator.sizeOf(value.get(0));
count = 1;
return key.getBytes().length + averageChunkMetadataSize * value.size();
}
return value.size() * chunkMetaDataSize + key.length() * 2;
}
};
}
......
......@@ -66,7 +66,7 @@ public class TimeSeriesMetadataCache {
long currentSize = RamUsageEstimator.shallowSizeOf(key) + RamUsageEstimator.sizeOf(value);
averageSize = ((averageSize * count) + currentSize) / (++count);
return currentSize;
} else if (count < 10000) {
} else if (count < 100000) {
count++;
return averageSize;
} else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册