Skip to content

Commit fcc1c0d

Browse files
committed
perf: replaced hashmap of rids and hashset of rids with custom classes to optimize RAM and CPU
1 parent 891e2f1 commit fcc1c0d

14 files changed

Lines changed: 274 additions & 27 deletions

engine/src/main/java/com/arcadedb/database/TransactionContext.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.arcadedb.index.lsm.LSMTreeIndexAbstract;
3939
import com.arcadedb.log.LogManager;
4040
import com.arcadedb.schema.LocalSchema;
41+
import com.arcadedb.utility.RidHashSet;
4142

4243
import java.io.*;
4344
import java.util.*;
@@ -64,7 +65,7 @@ public class TransactionContext implements Transaction {
6465
private final Map<RID, Record> modifiedRecordsCache = new HashMap<>(1024);
6566
private final TransactionIndexContext indexChanges;
6667
private final Map<PageId, ImmutablePage> immutablePages = new HashMap<>(64);
67-
private final Set<RID> deletedRecordsInTx = new HashSet<>();
68+
private final RidHashSet deletedRecordsInTx = new RidHashSet();
6869
private Map<PageId, MutablePage> modifiedPages;
6970
private Map<PageId, MutablePage> newPages;
7071
private boolean useWAL;

engine/src/main/java/com/arcadedb/function/sql/graph/SQLFunctionDuanSSSP.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import com.arcadedb.query.sql.executor.Result;
3030
import com.arcadedb.function.sql.math.SQLFunctionMathAbstract;
3131

32+
import com.arcadedb.utility.RidHashSet;
33+
3234
import java.util.*;
3335

3436
/**
@@ -105,7 +107,7 @@ private List<RID> executeDuanSSSP(final Vertex source, final Vertex dest, final
105107
final Map<RID, Double> distances = new HashMap<>();
106108
final Map<RID, RID> predecessors = new HashMap<>();
107109
final PriorityQueue<VertexDistance> pq = new PriorityQueue<>();
108-
final Set<RID> visited = new HashSet<>();
110+
final RidHashSet visited = new RidHashSet();
109111

110112
distances.put(source.getIdentity(), 0.0);
111113
pq.offer(new VertexDistance(source.getIdentity(), 0.0));

engine/src/main/java/com/arcadedb/function/sql/graph/SQLFunctionMoveFiltered.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import com.arcadedb.query.sql.executor.SQLFunctionFiltered;
2828
import com.arcadedb.utility.FileUtils;
2929

30+
import com.arcadedb.utility.RidHashSet;
31+
3032
import java.util.*;
3133

3234
/**
@@ -47,7 +49,7 @@ public Object execute(final Object self, final Identifiable currentRecord, final
4749
else
4850
labels = null;
4951

50-
final Set<RID> possibleRIDs = buildRIDSet(iPossibleResults);
52+
final RidHashSet possibleRIDs = buildRIDSet(iPossibleResults);
5153

5254
return SQLQueryEngine.foreachRecord(iArgument -> {
5355
if (possibleRIDs != null && possibleRIDs.isEmpty())
@@ -61,10 +63,10 @@ public Object execute(final Object self, final Identifiable currentRecord, final
6163
}, self, context);
6264
}
6365

64-
private static Set<RID> buildRIDSet(final Iterable<?> iPossibleResults) {
66+
private static RidHashSet buildRIDSet(final Iterable<?> iPossibleResults) {
6567
if (iPossibleResults == null)
6668
return null;
67-
final Set<RID> rids = new HashSet<>();
69+
final RidHashSet rids = new RidHashSet();
6870
for (final Object item : iPossibleResults) {
6971
if (item instanceof Identifiable id)
7072
rids.add(id.getIdentity());
@@ -76,7 +78,7 @@ else if (item instanceof Result r) {
7678
return rids;
7779
}
7880

79-
private static Object filterByRIDs(final Object result, final Set<RID> possibleRIDs) {
81+
private static Object filterByRIDs(final Object result, final RidHashSet possibleRIDs) {
8082
if (result instanceof Iterable<?> iterable) {
8183
final List<Object> filtered = new ArrayList<>();
8284
for (final Object item : iterable) {

engine/src/main/java/com/arcadedb/function/sql/graph/SQLFunctionShortestPath.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@
3636
import com.arcadedb.utility.MultiIterator;
3737
import com.arcadedb.utility.Pair;
3838

39+
import com.arcadedb.utility.RidHashSet;
40+
3941
import java.util.ArrayDeque;
4042
import java.util.ArrayList;
4143
import java.util.HashMap;
42-
import java.util.HashSet;
4344
import java.util.Iterator;
4445
import java.util.List;
4546
import java.util.Locale;
4647
import java.util.Map;
47-
import java.util.Set;
4848

4949
/**
5050
* Shortest path algorithm to find the shortest path from one node to another node in a directed graph.
@@ -71,8 +71,8 @@ private static class ShortestPathContext {
7171
ArrayDeque<Vertex> queueLeft = new ArrayDeque<>();
7272
ArrayDeque<Vertex> queueRight = new ArrayDeque<>();
7373

74-
final Set<RID> leftVisited = new HashSet<>();
75-
final Set<RID> rightVisited = new HashSet<>();
74+
final RidHashSet leftVisited = new RidHashSet();
75+
final RidHashSet rightVisited = new RidHashSet();
7676
final Map<RID, RID> previouses = new HashMap<>();
7777
final Map<RID, RID> nexts = new HashMap<>();
7878

engine/src/main/java/com/arcadedb/index/lsm/LSMTreeIndexAbstract.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.arcadedb.serializer.BinarySerializer;
3737
import com.arcadedb.serializer.BinaryTypes;
3838
import com.arcadedb.utility.FileUtils;
39+
import com.arcadedb.utility.RidHashSet;
3940

4041
import java.io.*;
4142
import java.util.*;
@@ -555,8 +556,8 @@ protected boolean lookupInPageAndAddInResultset(final BasePage currentPage, fina
555556
// REAL ALL THE ENTRIES
556557
final List<RID> allValues = readAllValuesFromResult(currentPageBuffer, result);
557558

558-
final Set<RID> validRIDs = new HashSet<>();
559-
final Set<RID> deletedRIDs = new HashSet<>();
559+
final RidHashSet validRIDs = new RidHashSet();
560+
final RidHashSet deletedRIDs = new RidHashSet();
560561

561562
final TransactionIndexContext.ComparableKey keys = new TransactionIndexContext.ComparableKey(convertedKeys);
562563

engine/src/main/java/com/arcadedb/index/vector/LSMVectorIndex.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import com.arcadedb.serializer.json.JSONObject;
5959
import com.arcadedb.utility.LockManager;
6060
import com.arcadedb.utility.Pair;
61+
import com.arcadedb.utility.RidHashSet;
6162
import io.github.jbellis.jvector.graph.GraphIndexBuilder;
6263
import io.github.jbellis.jvector.graph.GraphSearcher;
6364
import io.github.jbellis.jvector.graph.ImmutableGraphIndex;
@@ -90,7 +91,6 @@
9091
import java.util.Arrays;
9192
import java.util.Collections;
9293
import java.util.HashMap;
93-
import java.util.HashSet;
9494
import java.util.Iterator;
9595
import java.util.List;
9696
import java.util.Map;
@@ -2397,7 +2397,7 @@ private void mergeWithDeltaScan(final VectorFloat<?> queryVectorFloat, final int
23972397
return;
23982398

23992399
// Collect already-seen RIDs from graph results to avoid duplicates
2400-
final Set<RID> seenRIDs = new HashSet<>(results.size());
2400+
final RidHashSet seenRIDs = new RidHashSet(results.size());
24012401
for (final Pair<RID, Float> r : results)
24022402
seenRIDs.add(r.getFirst());
24032403

engine/src/main/java/com/arcadedb/query/opencypher/executor/steps/MatchRelationshipStep.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@
3636
import com.arcadedb.query.sql.executor.ResultInternal;
3737
import com.arcadedb.query.sql.executor.ResultSet;
3838

39+
import com.arcadedb.utility.RidHashSet;
40+
3941
import java.util.ArrayList;
4042
import java.util.Arrays;
41-
import java.util.HashSet;
4243
import java.util.Iterator;
4344
import java.util.List;
4445
import java.util.Map;
@@ -210,7 +211,7 @@ public ResultSet syncPull(final CommandContext context, final int nRecords) thro
210211
// (predecessor might create the edge type via CREATE/FOREACH/MERGE)
211212
private Boolean schemaShortCircuit = null;
212213
private boolean useFastPath = false;
213-
private Set<RID> seenEdges = null;
214+
private RidHashSet seenEdges = null;
214215
private final List<Result> buffer = new ArrayList<>();
215216
private int bufferIndex = 0;
216217
private boolean finished = false;
@@ -333,7 +334,7 @@ private void fetchMore(final int n) {
333334
currentEdges = getEdges(sourceVertex);
334335
currentVertices = null;
335336
currentGavNeighborIds = null;
336-
seenEdges = getEffectiveDirection() == Direction.BOTH ? new HashSet<>() : null;
337+
seenEdges = getEffectiveDirection() == Direction.BOTH ? new RidHashSet() : null;
337338
}
338339
} else {
339340
// Source is not a vertex, skip

engine/src/main/java/com/arcadedb/query/opencypher/executor/steps/OptionalMatchStep.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@
2828
import com.arcadedb.query.sql.executor.ResultInternal;
2929
import com.arcadedb.query.sql.executor.ResultSet;
3030

31+
import com.arcadedb.utility.RidHashSet;
32+
3133
import java.util.ArrayList;
32-
import java.util.HashSet;
3334
import java.util.List;
3435
import java.util.NoSuchElementException;
3536
import java.util.Set;
@@ -99,7 +100,7 @@ public ResultSet syncPull(final CommandContext context, final int nRecords) thro
99100
private boolean finished = false;
100101

101102
// Count-only mode: track unique RIDs instead of full Result objects
102-
private final Set<RID> uniqueRIDs = countOnlyMode ? new HashSet<>() : null;
103+
private final RidHashSet uniqueRIDs = countOnlyMode ? new RidHashSet() : null;
103104
private long currentInputMatchCount = 0;
104105

105106
@Override

engine/src/main/java/com/arcadedb/query/opencypher/procedures/path/PathExpandConfig.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import com.arcadedb.query.sql.executor.Result;
2626
import com.arcadedb.query.sql.executor.ResultInternal;
2727

28+
import com.arcadedb.utility.RidHashSet;
29+
2830
import java.util.ArrayList;
2931
import java.util.HashSet;
3032
import java.util.List;
@@ -126,7 +128,7 @@ private void expandBFS(final Vertex startNode, final String[] relTypes, final St
126128
final List<List<Object>> allPaths, final CommandContext context) {
127129

128130
final List<List<Object>> frontier = new ArrayList<>();
129-
final Set<RID> visited = new HashSet<>();
131+
final RidHashSet visited = new RidHashSet();
130132

131133
final List<Object> initialPath = new ArrayList<>();
132134
initialPath.add(startNode);
@@ -156,7 +158,7 @@ private void expandBFS(final Vertex startNode, final String[] relTypes, final St
156158
}
157159

158160
private void expandFromNode(final Vertex node, final String[] relTypes, final String[] labelFilter,
159-
final List<Object> currentPath, final Set<RID> visited, final List<List<Object>> nextFrontier) {
161+
final List<Object> currentPath, final RidHashSet visited, final List<List<Object>> nextFrontier) {
160162

161163
// Expand in both directions
162164
for (final Vertex.DIRECTION direction : new Vertex.DIRECTION[] { Vertex.DIRECTION.OUT, Vertex.DIRECTION.IN }) {

engine/src/main/java/com/arcadedb/query/opencypher/procedures/path/PathSpanningTree.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@
2525
import com.arcadedb.query.sql.executor.Result;
2626
import com.arcadedb.query.sql.executor.ResultInternal;
2727

28+
import com.arcadedb.utility.RidHashSet;
29+
2830
import java.util.ArrayDeque;
2931
import java.util.ArrayList;
3032
import java.util.HashMap;
31-
import java.util.HashSet;
3233
import java.util.List;
3334
import java.util.Map;
3435
import java.util.Queue;
35-
import java.util.Set;
3636
import java.util.stream.Stream;
3737

3838
/**
@@ -96,7 +96,7 @@ public Stream<Result> execute(final Object[] args, final Result inputRow, final
9696

9797
// BFS to build spanning tree
9898
final List<List<Object>> allPaths = new ArrayList<>();
99-
final Set<RID> visited = new HashSet<>();
99+
final RidHashSet visited = new RidHashSet();
100100
final Queue<PathLevel> queue = new ArrayDeque<>();
101101

102102
final List<Object> initialPath = new ArrayList<>();

0 commit comments

Comments
 (0)