You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by iv...@apache.org on 2025/03/13 15:45:08 UTC

(lucene) branch main updated: deduplicate standard BKDConfig records (#14338)

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

ivera pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/lucene.git


The following commit(s) were added to refs/heads/main by this push:
     new 52f3c3e6e5e deduplicate standard BKDConfig records (#14338)
52f3c3e6e5e is described below

commit 52f3c3e6e5ef5a552b74485729f98ef26b2ef44a
Author: Ignacio Vera <iv...@apache.org>
AuthorDate: Thu Mar 13 16:45:02 2025 +0100

    deduplicate standard BKDConfig records (#14338)
    
    This should save some heap usage on the BKDReader.
---
 lucene/CHANGES.txt                                 |  2 ++
 .../java/org/apache/lucene/util/bkd/BKDConfig.java | 26 ++++++++++++++++++++++
 .../java/org/apache/lucene/util/bkd/BKDReader.java |  2 +-
 .../org/apache/lucene/util/bkd/TestBKDConfig.java  | 24 ++++++++++++++++++++
 4 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index f9091382913..374ebef954d 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -174,6 +174,8 @@ Optimizations
 
 * GITHUB#14272: Use DocIdSetIterator#range for continuous-id BKD leaves. (Guo Feng)
 
+* GITHUB#14338: Deduplicate BKDConfig records in BKDReader. (Ignacio Vera)
+
 Bug Fixes
 ---------------------
 
diff --git a/lucene/core/src/java/org/apache/lucene/util/bkd/BKDConfig.java b/lucene/core/src/java/org/apache/lucene/util/bkd/BKDConfig.java
index c2f4a1dfc47..b996def6a8b 100644
--- a/lucene/core/src/java/org/apache/lucene/util/bkd/BKDConfig.java
+++ b/lucene/core/src/java/org/apache/lucene/util/bkd/BKDConfig.java
@@ -17,6 +17,7 @@
 
 package org.apache.lucene.util.bkd;
 
+import java.util.List;
 import org.apache.lucene.util.ArrayUtil;
 
 /**
@@ -38,6 +39,20 @@ public record BKDConfig(int numDims, int numIndexDims, int bytesPerDim, int maxP
   /** Maximum number of index dimensions */
   public static final int MAX_INDEX_DIMS = 8;
 
+  private static final List<BKDConfig> DEFAULT_CONFIGS =
+      List.of(
+          // cover the most common types for 1 and 2 dimensions.
+          new BKDConfig(1, 1, 2, DEFAULT_MAX_POINTS_IN_LEAF_NODE),
+          new BKDConfig(1, 1, 4, DEFAULT_MAX_POINTS_IN_LEAF_NODE),
+          new BKDConfig(1, 1, 8, DEFAULT_MAX_POINTS_IN_LEAF_NODE),
+          new BKDConfig(1, 1, 16, DEFAULT_MAX_POINTS_IN_LEAF_NODE),
+          new BKDConfig(2, 2, 2, DEFAULT_MAX_POINTS_IN_LEAF_NODE),
+          new BKDConfig(2, 2, 4, DEFAULT_MAX_POINTS_IN_LEAF_NODE),
+          new BKDConfig(2, 2, 8, DEFAULT_MAX_POINTS_IN_LEAF_NODE),
+          new BKDConfig(2, 2, 16, DEFAULT_MAX_POINTS_IN_LEAF_NODE),
+          // cover lucene shapes
+          new BKDConfig(7, 4, 4, DEFAULT_MAX_POINTS_IN_LEAF_NODE));
+
   public BKDConfig {
     // Check inputs are on bounds
     if (numDims < 1 || numDims > MAX_DIMS) {
@@ -68,6 +83,17 @@ public record BKDConfig(int numDims, int numIndexDims, int bytesPerDim, int maxP
     }
   }
 
+  public static BKDConfig of(
+      int numDims, int numIndexDims, int bytesPerDim, int maxPointsInLeafNode) {
+    final BKDConfig config = new BKDConfig(numDims, numIndexDims, bytesPerDim, maxPointsInLeafNode);
+    final int defaultConfigIndex = BKDConfig.DEFAULT_CONFIGS.indexOf(config);
+    if (defaultConfigIndex != -1) {
+      return BKDConfig.DEFAULT_CONFIGS.get(defaultConfigIndex);
+    } else {
+      return config;
+    }
+  }
+
   /** numDims * bytesPerDim */
   public int packedBytesLength() {
     return numDims * bytesPerDim;
diff --git a/lucene/core/src/java/org/apache/lucene/util/bkd/BKDReader.java b/lucene/core/src/java/org/apache/lucene/util/bkd/BKDReader.java
index 2f1d38513ae..17b0cb79845 100644
--- a/lucene/core/src/java/org/apache/lucene/util/bkd/BKDReader.java
+++ b/lucene/core/src/java/org/apache/lucene/util/bkd/BKDReader.java
@@ -68,7 +68,7 @@ public class BKDReader extends PointValues {
     }
     final int maxPointsInLeafNode = metaIn.readVInt();
     final int bytesPerDim = metaIn.readVInt();
-    config = new BKDConfig(numDims, numIndexDims, bytesPerDim, maxPointsInLeafNode);
+    config = BKDConfig.of(numDims, numIndexDims, bytesPerDim, maxPointsInLeafNode);
 
     // Read index:
     numLeaves = metaIn.readVInt();
diff --git a/lucene/core/src/test/org/apache/lucene/util/bkd/TestBKDConfig.java b/lucene/core/src/test/org/apache/lucene/util/bkd/TestBKDConfig.java
index 6a137009ca7..36f67281979 100644
--- a/lucene/core/src/test/org/apache/lucene/util/bkd/TestBKDConfig.java
+++ b/lucene/core/src/test/org/apache/lucene/util/bkd/TestBKDConfig.java
@@ -70,4 +70,28 @@ public class TestBKDConfig extends LuceneTestCase {
           ex.getMessage().contains("maxPointsInLeafNode must be <= ArrayUtil.MAX_ARRAY_LENGTH"));
     }
   }
+
+  public void testDeduplicate() {
+    {
+      for (int dims : new int[] {1, 2}) {
+        for (int bytesPerDim : new int[] {2, 4, 8, 16}) {
+          BKDConfig config =
+              BKDConfig.of(dims, dims, bytesPerDim, BKDConfig.DEFAULT_MAX_POINTS_IN_LEAF_NODE);
+          BKDConfig deduped =
+              BKDConfig.of(dims, dims, bytesPerDim, BKDConfig.DEFAULT_MAX_POINTS_IN_LEAF_NODE);
+          assertSame(deduped, config);
+        }
+      }
+    }
+    {
+      BKDConfig config = BKDConfig.of(7, 4, 4, BKDConfig.DEFAULT_MAX_POINTS_IN_LEAF_NODE);
+      BKDConfig deduped = BKDConfig.of(7, 4, 4, BKDConfig.DEFAULT_MAX_POINTS_IN_LEAF_NODE);
+      assertSame(deduped, config);
+    }
+    {
+      BKDConfig config = BKDConfig.of(1, 1, 6, BKDConfig.DEFAULT_MAX_POINTS_IN_LEAF_NODE);
+      BKDConfig deduped = BKDConfig.of(1, 1, 6, BKDConfig.DEFAULT_MAX_POINTS_IN_LEAF_NODE);
+      assertNotSame(config, deduped);
+    }
+  }
 }