This is an automated email from the ASF dual-hosted git repository.

jiangtian pushed a commit to branch dev/1.1
in repository https://gitbox.apache.org/repos/asf/tsfile.git


The following commit(s) were added to refs/heads/dev/1.1 by this push:
     new dd3adac8 [To dev/1.1] Added memory calculation for tablet (#636) (#638)
dd3adac8 is described below

commit dd3adac82a39bae38f188d0ca3a3e14091c1203b
Author: Caideyipi <[email protected]>
AuthorDate: Thu Nov 13 16:05:57 2025 +0800

    [To dev/1.1] Added memory calculation for tablet (#636) (#638)
    
    * Added memory calculation for tablet (#636)
    
    * fx
    
    * fix
    
    * dl
    
    * fix
    
    * Update Tablet.java
---
 .../org/apache/tsfile/utils/RamUsageEstimator.java | 76 ++++++++++++++++++++++
 .../org/apache/tsfile/write/record/Tablet.java     | 68 ++++++++++++++++++-
 2 files changed, 142 insertions(+), 2 deletions(-)

diff --git 
a/java/common/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java 
b/java/common/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java
index af7a8cff..29b9d085 100644
--- a/java/common/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java
+++ b/java/common/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java
@@ -27,6 +27,7 @@ import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -35,6 +36,7 @@ import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -99,6 +101,11 @@ public final class RamUsageEstimator {
   /** Sizes of primitive classes. */
   public static final Map<Class<?>, Integer> primitiveSizes;
 
+  public static final long LOCAL_DATE_ARRAY_SIZE;
+  public static final long LOCAL_DATE_SIZE;
+  public static final long BIT_MAP_SIZE;
+  public static final long SIZE_OF_ARRAYLIST;
+
   static {
     Map<Class<?>, Integer> primitiveSizesMap = new IdentityHashMap<>();
     primitiveSizesMap.put(boolean.class, 1);
@@ -111,6 +118,11 @@ public final class RamUsageEstimator {
     primitiveSizesMap.put(long.class, Long.BYTES);
 
     primitiveSizes = Collections.unmodifiableMap(primitiveSizesMap);
+
+    LOCAL_DATE_ARRAY_SIZE = RamUsageEstimator.shallowSizeOf(LocalDate[].class);
+    LOCAL_DATE_SIZE = RamUsageEstimator.shallowSizeOf(LocalDate.class);
+    BIT_MAP_SIZE = RamUsageEstimator.shallowSizeOfInstance(BitMap.class);
+    SIZE_OF_ARRAYLIST = 
RamUsageEstimator.shallowSizeOfInstance(ArrayList.class);
   }
 
   /** JVMs typically cache small longs. This tries to find out what the range 
is. */
@@ -654,4 +666,68 @@ public final class RamUsageEstimator {
   public static long sizeOfObjectArray(int length) {
     return alignObjectSize(NUM_BYTES_ARRAY_HEADER + (long) 
NUM_BYTES_OBJECT_REF * length);
   }
+
+  private static long sizeOf(final Binary binary) {
+    return Objects.nonNull(binary) ? binary.ramBytesUsed() : 0L;
+  }
+
+  public static long sizeOf(final Binary[] binaries) {
+    if (binaries == null) {
+      return 0L;
+    }
+
+    long size = 0L;
+    for (Binary binary : binaries) {
+      size += sizeOf(binary);
+    }
+
+    return size + RamUsageEstimator.shallowSizeOf(binaries);
+  }
+
+  public static long sizeOfStringArray(final String[] values) {
+    return Objects.nonNull(values) ? RamUsageEstimator.sizeOf(values) : 0L;
+  }
+
+  public static long sizeOf(BitMap[] bitMaps) {
+    if (bitMaps == null) {
+      return 0L;
+    }
+    long size =
+        RamUsageEstimator.alignObjectSize(
+            NUM_BYTES_ARRAY_HEADER + (long) NUM_BYTES_OBJECT_REF * 
bitMaps.length);
+    for (BitMap bitMap : bitMaps) {
+      size += sizeOf(bitMap);
+    }
+    return size;
+  }
+
+  private static long sizeOf(final BitMap bitMap) {
+    if (bitMap == null) {
+      return 0L;
+    }
+    long size = BIT_MAP_SIZE;
+
+    size +=
+        RamUsageEstimator.alignObjectSize(NUM_BYTES_ARRAY_HEADER + 
bitMap.getByteArray().length);
+    return size;
+  }
+
+  public static long sizeOf(final LocalDate[] input) {
+    if (Objects.isNull(input)) {
+      return 0;
+    }
+    long size =
+        RamUsageEstimator.alignObjectSize(
+            LOCAL_DATE_ARRAY_SIZE + (long) input.length * 
NUM_BYTES_OBJECT_REF);
+    for (final LocalDate date : input) {
+      if (Objects.nonNull(date)) {
+        size += LOCAL_DATE_SIZE;
+      }
+    }
+    return size;
+  }
+
+  public static long shallowSizeOfList(final List<?> input) {
+    return alignObjectSize(SIZE_OF_ARRAYLIST + (long) input.size() * 
NUM_BYTES_OBJECT_REF);
+  }
 }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/record/Tablet.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/record/Tablet.java
index 9bd8d88f..27ed30a6 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/record/Tablet.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/record/Tablet.java
@@ -21,11 +21,13 @@ package org.apache.tsfile.write.record;
 
 import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.utils.Accountable;
 import org.apache.tsfile.utils.Binary;
 import org.apache.tsfile.utils.BitMap;
 import org.apache.tsfile.utils.BytesUtils;
 import org.apache.tsfile.utils.DateUtils;
 import org.apache.tsfile.utils.PublicBAOS;
+import org.apache.tsfile.utils.RamUsageEstimator;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 import org.apache.tsfile.write.UnSupportedDataTypeException;
 import org.apache.tsfile.write.schema.MeasurementSchema;
@@ -50,8 +52,8 @@ import java.util.Objects;
  *
  * <p>Notice: The tablet should not have empty cell, please use BitMap to 
denote null value
  */
-public class Tablet {
-
+public class Tablet implements Accountable {
+  private static final long TABLET_SIZE = 
RamUsageEstimator.shallowSizeOfInstance(Tablet.class);
   private static final int DEFAULT_SIZE = 1024;
   private static final String NOT_SUPPORT_DATATYPE = "Data type %s is not 
supported.";
 
@@ -862,4 +864,66 @@ public class Tablet {
     }
     return true;
   }
+
+  @Override
+  public long ramBytesUsed() {
+    long totalSizeInBytes =
+        TABLET_SIZE
+            + RamUsageEstimator.sizeOf(deviceId)
+            + RamUsageEstimator.sizeOf(timestamps)
+            + RamUsageEstimator.sizeOf(bitMaps)
+            + RamUsageEstimator.sizeOfMap(measurementIndex);
+
+    // values
+    final List<MeasurementSchema> timeSeries = schemas;
+
+    if (timeSeries != null) {
+      totalSizeInBytes += RamUsageEstimator.shallowSizeOfList(timeSeries);
+      for (int column = 0; column < timeSeries.size(); column++) {
+        final MeasurementSchema measurementSchema = timeSeries.get(column);
+        if (measurementSchema == null) {
+          continue;
+        }
+        // Measurement schema size
+        totalSizeInBytes += 75;
+
+        final TSDataType tsDataType = measurementSchema.getType();
+        if (tsDataType == null) {
+          continue;
+        }
+
+        if (values == null || values.length <= column) {
+          continue;
+        }
+        switch (tsDataType) {
+          case INT64:
+          case TIMESTAMP:
+            totalSizeInBytes += RamUsageEstimator.sizeOf((long[]) 
values[column]);
+            break;
+          case DATE:
+            totalSizeInBytes += RamUsageEstimator.sizeOf((LocalDate[]) 
values[column]);
+            break;
+          case INT32:
+            totalSizeInBytes += RamUsageEstimator.sizeOf((int[]) 
values[column]);
+            break;
+          case DOUBLE:
+            totalSizeInBytes += RamUsageEstimator.sizeOf((double[]) 
values[column]);
+            break;
+          case FLOAT:
+            totalSizeInBytes += RamUsageEstimator.sizeOf((float[]) 
values[column]);
+            break;
+          case BOOLEAN:
+            totalSizeInBytes += RamUsageEstimator.sizeOf((boolean[]) 
values[column]);
+            break;
+          case STRING:
+          case TEXT:
+          case BLOB:
+            totalSizeInBytes += RamUsageEstimator.sizeOf((Binary[]) 
values[column]);
+            break;
+        }
+      }
+    }
+
+    return totalSizeInBytes;
+  }
 }

Reply via email to