pub struct CollectionConfig {
pub dim: usize,
pub metric: Metric,
pub hnsw: HnswParams,
}Fields§
§dim: usize§metric: Metric§hnsw: HnswParamsImplementations§
Source§impl CollectionConfig
impl CollectionConfig
Sourcepub fn new(dim: usize, metric: Metric) -> Self
pub fn new(dim: usize, metric: Metric) -> Self
Examples found in repository?
examples/bench.rs (line 71)
55fn main() -> recern_vector::Result<()> {
56 let args: Vec<String> = std::env::args().skip(1).collect();
57 let arg = |i: usize| {
58 args.get(i)
59 .map(|a| a.parse::<f64>().expect("numeric argument"))
60 };
61 let records = arg(0).map_or(50_000, |v| v as usize);
62 let dim = arg(1).map_or(128, |v| v as usize);
63 let noise = arg(2).map_or(1.0, |v| v as f32);
64 let path = std::env::temp_dir().join("recern-vector-bench.rvec");
65 let _ = std::fs::remove_file(&path);
66
67 let mut data = Clusters::new(100, dim, noise, 0x5EED);
68 let vectors: Vec<Vec<f32>> = (0..records).map(|_| data.sample()).collect();
69
70 let mut db = Database::create(&path)?;
71 let collection = db.create_collection("bench", CollectionConfig::new(dim, Metric::Cosine))?;
72 let start = Instant::now();
73 for (i, v) in vectors.iter().enumerate() {
74 collection.upsert(&i.to_string(), v, None)?;
75 }
76 let build = start.elapsed();
77
78 let start = Instant::now();
79 db.save()?;
80 let save = start.elapsed();
81 let start = Instant::now();
82 let db = Database::open(&path)?;
83 let open = start.elapsed();
84 let collection = db.collection("bench")?;
85 let stats = collection.stats();
86
87 println!("records {records} · dim {dim} · noise {noise} · cosine · m=16 ef_construction=200");
88 println!(
89 "build {:.2} s ({:.0} inserts/s)",
90 build.as_secs_f64(),
91 records as f64 / build.as_secs_f64()
92 );
93 println!(
94 "file {:.1} MB · save {:.0} ms · open {:.0} ms",
95 std::fs::metadata(&path)?.len() as f64 / 1_048_576.0,
96 save.as_secs_f64() * 1e3,
97 open.as_secs_f64() * 1e3
98 );
99 println!(
100 "graph layers {:?} · avg degree L0 {:.1} · unreachable {}",
101 stats.nodes_per_layer, stats.avg_degree_layer0, stats.unreachable
102 );
103
104 let report = collection.estimate_recall(&RecallOptions {
105 sample: 200,
106 k: 10,
107 ef_values: vec![10, 16, 32, 64, 128, 256],
108 seed: 7,
109 })?;
110 println!();
111 println!(
112 "exact scan p50 {:.3} ms",
113 report.exact_p50.as_secs_f64() * 1e3
114 );
115 println!(
116 "{:>6} {:>9} {:>10} {:>10} {:>9}",
117 "ef", "recall@10", "p50 ms", "p95 ms", "speedup"
118 );
119 for p in &report.points {
120 println!(
121 "{:>6} {:>9.3} {:>10.3} {:>10.3} {:>8.0}x",
122 p.ef,
123 p.recall,
124 p.p50.as_secs_f64() * 1e3,
125 p.p95.as_secs_f64() * 1e3,
126 report.exact_p50.as_secs_f64() / p.p50.as_secs_f64()
127 );
128 }
129
130 let _ = std::fs::remove_file(&path);
131 Ok(())
132}pub fn with_hnsw(self, hnsw: HnswParams) -> Self
Trait Implementations§
Source§impl Clone for CollectionConfig
impl Clone for CollectionConfig
impl Copy for CollectionConfig
Source§impl Debug for CollectionConfig
impl Debug for CollectionConfig
impl Eq for CollectionConfig
Source§impl PartialEq for CollectionConfig
impl PartialEq for CollectionConfig
impl StructuralPartialEq for CollectionConfig
Auto Trait Implementations§
impl Freeze for CollectionConfig
impl RefUnwindSafe for CollectionConfig
impl Send for CollectionConfig
impl Sync for CollectionConfig
impl Unpin for CollectionConfig
impl UnsafeUnpin for CollectionConfig
impl UnwindSafe for CollectionConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more