use compressible_map::{BincodeCompression, CompressibleMap, LocalCache, Lz4};
use crossbeam::{channel, thread};
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct BigValue(Vec<u8>);
fn main() {
let compression = BincodeCompression::new(Lz4 { level: 10 });
let mut map = CompressibleMap::<_, _, _>::new(compression);
for i in 0..100 {
map.insert(i, BigValue(vec![0; 1024]));
}
for _ in 0..50 {
map.compress_lru();
}
let map_ref = ↦
let (tx, rx) = channel::unbounded();
{
let mut txs = Vec::new();
for _ in 0..99 {
txs.push(tx.clone());
}
txs.push(tx);
let txs_ref = &txs;
thread::scope(|s| {
for i in 0..100 {
s.spawn(move |_| {
let local_cache = LocalCache::new();
let _big_value = map_ref.get_const(i, &local_cache);
txs_ref[i as usize].send(local_cache).unwrap();
});
}
})
.unwrap();
}
loop {
match rx.recv() {
Ok(cache) => map.flush_local_cache(cache),
Err(_) => {
break;
}
}
}
assert_eq!(map.len_cached(), 100);
}