Skip to content
Merged
Prev Previous commit
Next Next commit
Turn slice of pointers to slice of structs
Greatly reduces number of allocations. For a query of 5,000 documents
from ~5000 allocations to ~50.
Number of allocations are also now constant, i.e. 50 for querying
100,000 documents.
  • Loading branch information
philippgille committed Mar 16, 2024
commit 503c3cecc849be3e463c4420852ca1b60e4b3f53
6 changes: 3 additions & 3 deletions query.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ func documentMatchesFilters(document *Document, where, whereDocument map[string]
return true
}

func calcDocSimilarity(ctx context.Context, queryVectors []float32, docs []*Document) ([]*docSim, error) {
similarities := make([]*docSim, 0, len(docs))
func calcDocSimilarity(ctx context.Context, queryVectors []float32, docs []*Document) ([]docSim, error) {
similarities := make([]docSim, 0, len(docs))
similaritiesLock := sync.Mutex{}

// Determine concurrency. Use number of docs or CPUs, whichever is smaller.
Expand Down Expand Up @@ -153,7 +153,7 @@ func calcDocSimilarity(ctx context.Context, queryVectors []float32, docs []*Docu

similaritiesLock.Lock()
// We don't defer the unlock because we want to unlock much earlier.
similarities = append(similarities, &docSim{docID: doc.ID, similarity: sim})
similarities = append(similarities, docSim{docID: doc.ID, similarity: sim})
similaritiesLock.Unlock()
}
}(docs[start:end])
Expand Down