Concurrent index: reverse-edge lists grow under update churn until consolidation
I maintainer di solito rispondono entro 5 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 42/100
Direzione di ricerca
Read include/svs/concurrent/reverse_edges.h and include/svs/concurrent/graph.h, especially replace_node_locked and the update_entries path, then inspect the C API memory accounting in bindings/c/src/svs_c.cpp. Reproduce the reported single-threaded update churn and track reverse-edge memory; done means reverse-edge storage stays bounded under repeated slot reuse without breaking concurrent writers or edge repair.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
With SVS_SYNC_KIND_FINE_GRAIN, the concurrent index's reverse-edge index
(ReverseEdges, include/svs/concurrent/reverse_edges.h) only ever gains
entries during inserts and updates. Stale entries are pruned only by
consolidation. A caller that reuses deleted slots with
svs_index_dynamic_update_points + svs_index_dynamic_replace_id (#467, #468)
rarely needs to consolidate, so these lists keep growing. The growth shows in
svs_index_get_memory_usage and in graph_bytes of
svs_index_get_memory_breakdown, because the C API adds reverse_edges_bytes
to graph_bytes (bindings/c/src/svs_c.cpp:678).
Where it comes from
The code below is on main (added in #369) and unchanged by #467 or #468;
line numbers are at 9330e49, the head of #468.
replace_node_locked(include/svs/concurrent/graph.h, around line 503)
records every new out-edge and, for every dropped out-edge, records the
reverse pairing. It never removes an entry. The exact variant is commented
out ("[Exact list] ... reverse_edges list would be exact for single
thread. Need investigation for concurent case.").ReverseEdgesstores each list as astd::vector, so capacity is never
returned even when consolidation removes entries.
Measurement
Single-threaded, through the C API. L2, FLOAT32, dimension 8,
graph_max_degree 64, construction window 128, 500 live vectors. Each round
deletes 100 vectors, then inserts 100 new ones into the deleted slots
(update_points on the deleted id, then replace_id to the new id). No
consolidation runs.
| Inserts | Memory growth since the initial fill |
|---|---|
| 0 | 0 (the index uses 226,598 bytes) |
| 5,000 | 252,580 |
| 20,000 | 260,004 |
| 40,000 | 265,124 |
data_bytes stays flat, so every slot is reused. All of the growth is in
graph_bytes, about 130 extra entries per node, roughly twice
graph_max_degree. After that it keeps rising slowly, by about 1.6 KB per
5,000 inserts.
Request
Could the reverse-edge index stay bounded without a full consolidation?
For example:
- remove the reverse entry when an edge is dropped (the commented-out exact
variant), if it can be made safe for concurrent writers; or - prune and
shrink_to_fita node's list whenupdate_entriesrewrites that
node, since it already holds the node's lock and repairs its edges.
Without one of these, an index whose inserts reuse deleted slots grows to
about twice its graph size under steady churn, even though it never adds a
slot.
- Lingua principale
- C++
- Stelle
- 241
- Fork
- 48
- Merge medio
- 4g 21h
- PR unite (30g)
- 11
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di intel/ScalableVectorSearch
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
intel/ScalableVectorSearch#356 ·
I maintainer di solito rispondono entro 5 giorni
-
Add CI test for C API on ARMApertaenhancement
Difficoltà 3/5 1-2 giorni Idoneità per principianti 32/100
intel/ScalableVectorSearch#460 ·
I maintainer di solito rispondono entro 5 giorni
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
intel/ScalableVectorSearch#438 ·
I maintainer di solito rispondono entro 5 giorni
-
CI: tier the test matrix into PR / main / nightly to cut Actions minutesForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 32/100
intel/ScalableVectorSearch#432 · 1 commento ·
I maintainer di solito rispondono entro 5 giorni
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
intel/ScalableVectorSearch#427 ·
I maintainer di solito rispondono entro 5 giorni
Tutte le issue di intel/ScalableVectorSearch
Issue simili
-
runtime: lf_f128_mod is documented as fmodq (truncating) but implements floor-based modulo; unusedApertainternal correctness low priority rt_lib
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 87/100
-
PriorityNotificationQueue::wakeUpAll() loses the wake-up for a thread that is not waiting yetForse già presa @matejk l’ha presa oggi. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
pocoproject/poco#5674 ·
I maintainer di solito rispondono entro 2 giorni
-
bug docs GUI
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
sonic-pi-net/sonic-pi#3609 ·
-
Unreachable code warningApertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
SanderMertens/flecs#2395 ·
I maintainer di solito rispondono entro 1 giorno