mod corpus_vectors;
use sparse_vector::handle::SparseHandle;
#[test]
#[ignore]
fn search_cost_per_segment() {
let dir = std::env::temp_dir().join("lucivy_sparse_segment_search");
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();
let h = SparseHandle::create(dir.to_str().unwrap()).unwrap();
let want: usize = std::env::var("BENCH_DOCS").ok().and_then(|v| v.parse().ok()).unwrap_or(40_000);
let corpus = match std::env::var("BENCH_CORPUS").as_deref() {
Ok("text") => corpus_vectors::build(want, 200),
_ => corpus_vectors::from_dump(want)
.unwrap_or_else(|| corpus_vectors::build(want, 200)),
};
eprintln!(" corpus: {} (x{} replicas)", corpus_vectors::describe(&corpus),
corpus_vectors::replicas(&corpus));
let total = corpus.docs.len() as u64;
let queries = corpus.queries.clone();
let time = |h: &SparseHandle| {
for q in &queries { h.search(q, 20); }
let mut runs: Vec<f64> = (0..5).map(|_| {
let t = std::time::Instant::now();
for q in &queries { h.search(q, 20); }
t.elapsed().as_secs_f64() * 1e3 / queries.len() as f64
}).collect();
runs.sort_by(|a, b| a.partial_cmp(b).unwrap());
runs[2]
};
for segments in [1u64, 5, 20, 50, 100] {
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();
std::env::set_var("LUCIVY_SPARSE_MAX_SEGMENTS", "0");
let h = SparseHandle::create(dir.to_str().unwrap()).unwrap();
let per = total / segments;
for s in 0..segments {
for i in 0..per {
let (id, v) = &corpus.docs[((s * per + i) % total) as usize];
h.insert(*id, v).unwrap();
}
h.commit_inner().unwrap();
}
let many = time(&h);
h.compact().unwrap();
let one = time(&h);
eprintln!("{segments:>3} segments of {per:>6} — search {many:>7.2} ms · after a merge {one:>7.2} ms · ×{:.1}",
many / one.max(1e-6));
}
drop(h);
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
#[ignore]
fn update_cost_per_segment() {
let corpus = corpus_vectors::from_dump(40_000)
.unwrap_or_else(|| corpus_vectors::build(40_000, 4));
let dir = std::env::temp_dir().join("lucivy_sparse_update_cost");
for segments in [1usize, 5, 20, 50, 100] {
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();
std::env::set_var("LUCIVY_SPARSE_MAX_SEGMENTS", "0");
let h = SparseHandle::create(dir.to_str().unwrap()).unwrap();
let per = corpus.docs.len() / segments;
for s in 0..segments {
for i in 0..per {
let (id, v) = &corpus.docs[s * per + i];
h.insert(*id, v).unwrap();
}
h.commit_inner().unwrap();
}
let sample: Vec<usize> = (0..500).map(|k| (k * 79) % (per * segments)).collect();
let t = std::time::Instant::now();
for &k in &sample {
let (id, v) = &corpus.docs[k];
h.insert(*id, v).unwrap();
}
let per_update = t.elapsed().as_secs_f64() * 1e6 / sample.len() as f64;
eprintln!("{segments:>3} segments — update {per_update:>8.1} µs each");
}
let _ = std::fs::remove_dir_all(&dir);
}