Skip to content

Commit 68f6eb4

Browse files
committed
Flush neighbors more
1 parent 14c716c commit 68f6eb4

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

pgvectorscale/src/access_method/graph/neighbor_store.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,26 +149,39 @@ impl BuilderNeighborCache {
149149
let current_size = cache.len();
150150
let capacity_val = cache.cap().get();
151151

152+
// pgrx::warning!("Should I flush?");
152153
if current_size as f64 / capacity_val as f64 > threshold {
153-
let target_size = (capacity_val as f64 * 0.5) as usize;
154+
// pgrx::warning!("Flushing neighbors");
155+
let target_size = 0;//(capacity_val as f64 * 0.5) as usize;
154156

155157
// Flush least recently used entries to disk
156158
while cache.len() > target_size {
157159
if let Some((neighbors_of, entry)) = cache.pop_lru() {
158-
let pruned_neighbors = if entry.neighbors.len() > self.num_neighbors {
160+
drop(cache);
161+
// Read existing neighbors from disk and merge with cached neighbors
162+
let disk_neighbors = storage.get_neighbors_with_distances_from_disk(neighbors_of, stats);
163+
let mut all_neighbors = entry.neighbors;
164+
for disk_neighbor in disk_neighbors {
165+
if !all_neighbors.iter().any(|n: &NeighborWithDistance| n.get_index_pointer_to_neighbor() == disk_neighbor.get_index_pointer_to_neighbor()) {
166+
all_neighbors.push(disk_neighbor);
167+
}
168+
}
169+
170+
let pruned_neighbors = if all_neighbors.len() > self.num_neighbors {
159171
Graph::prune_neighbors(
160172
self.max_alpha,
161173
self.num_neighbors,
162174
entry.labels.as_ref(),
163-
entry.neighbors,
175+
all_neighbors,
164176
storage,
165177
stats,
166178
)
167179
} else {
168-
entry.neighbors
180+
all_neighbors
169181
};
170182

171183
storage.set_neighbors_on_disk(neighbors_of, &pruned_neighbors, stats);
184+
cache = self.neighbor_map.borrow_mut();
172185
} else {
173186
break;
174187
}

0 commit comments

Comments
 (0)