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);
+ }
+ }
}