Skip to content

Commit aef2ad0

Browse files
committed
perf: use bloomfilter crate
1 parent cc1ebb7 commit aef2ad0

4 files changed

Lines changed: 16 additions & 101 deletions

File tree

Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,8 @@ doctest = false
2121

2222
[dependencies]
2323
flate2 = "1.0"
24-
farmhash = "1.1.5"
25-
bitvec = "1.0.1"
26-
serde = { version = "1.0.196", features = ["derive"] }
24+
serde = { version = "1.0", features = ["derive"] }
25+
bloomfilter = "1.0"
2726
fs2 = "0.4.3"
2827
bincode = "1.3.3"
2928

src/bloom/mod.rs

Lines changed: 0 additions & 75 deletions
This file was deleted.

src/collection/storage.rs

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use crate::bloom;
21
use crate::error::{Error, Result};
2+
use bloomfilter::Bloom;
33
use flate2::{read::GzDecoder, write::GzEncoder, Compression};
44
use serde::Deserialize;
55
use serde::{de::DeserializeOwned, Serialize};
@@ -55,13 +55,13 @@ impl Storage {
5555
where
5656
T: Sync + Send + Clone + Debug + Serialize + 'static,
5757
{
58-
if self.filter.contains(&tuple.key) {
58+
if self.contains(&tuple.key) {
5959
return Err(Error::AlreadyExists(format!("Key: {}", tuple.key)));
6060
}
6161

6262
let segment = Storage::serialize_value(&tuple.value);
6363

64-
self.filter.insert(&tuple.key);
64+
self.filter.insert(tuple.key.to_string());
6565
let offset = self.file.len().unwrap();
6666

6767
let index_entry = IndexEntry {
@@ -118,7 +118,6 @@ impl Storage {
118118
return Err(Error::NotFound(format!("Key: {}", key)));
119119
}
120120

121-
self.filter.remove(&key);
122121
let entry = self.index.remove(key).unwrap();
123122

124123
let old_value = self
@@ -167,14 +166,13 @@ impl Storage {
167166
}
168167

169168
pub fn clear(&mut self) -> Result<()> {
170-
self.filter.clear();
171169
self.index.clear();
172170

173171
Ok(())
174172
}
175173

176174
pub fn contains(&self, key: &str) -> bool {
177-
self.filter.contains(key)
175+
self.filter.contains(key.to_string())
178176
}
179177

180178
fn serialize_value<T>(value: &T) -> Vec<u8>
@@ -312,7 +310,7 @@ impl Index {
312310
.read(true)
313311
.write(true)
314312
.create(true)
315-
.open(index_path.clone())
313+
.open(&index_path)
316314
.map_err(Error::IoError)?;
317315

318316
let inner = if file.metadata().unwrap().len() == 0 {
@@ -394,33 +392,27 @@ impl Drop for Index {
394392

395393
#[derive(Debug)]
396394
struct Filter {
397-
bloom: bloom::BloomFilter,
395+
bloom: Bloom<String>,
398396
}
399397

398+
const BLOOM_FILTER_SIZE: usize = 100_000;
399+
400400
impl Filter {
401401
pub fn new(keys: Vec<String>) -> Self {
402-
let mut bloom = bloom::BloomFilter::new(0.01, (keys.len() + 50) * 8);
402+
let mut bloom = Bloom::new_for_fp_rate(BLOOM_FILTER_SIZE, 0.01);
403403

404404
for key in keys {
405-
bloom.insert(&key);
405+
bloom.set(&key);
406406
}
407407

408408
Self { bloom }
409409
}
410410

411-
pub fn insert(&mut self, key: &str) {
412-
self.bloom.insert(key);
413-
}
414-
415-
pub fn contains(&self, key: &str) -> bool {
416-
self.bloom.contains(key)
411+
pub fn insert(&mut self, key: String) {
412+
self.bloom.set(&key);
417413
}
418414

419-
pub fn remove(&mut self, key: &str) {
420-
self.bloom.remove(key);
421-
}
422-
423-
pub fn clear(&mut self) {
424-
self.bloom.clear();
415+
pub fn contains(&self, key: String) -> bool {
416+
self.bloom.check(&key)
425417
}
426418
}

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
//! let user = collection.get("user:1").unwrap();
4747
//! ```
4848
49-
pub mod bloom;
5049
pub mod collection;
5150
pub mod config;
5251
pub mod error;

0 commit comments

Comments
 (0)