bucket_map.rs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. use {
  2. rayon::prelude::*,
  3. solana_bucket_map::bucket_map::{BucketMap, BucketMapConfig},
  4. solana_measure::measure::Measure,
  5. solana_pubkey::Pubkey,
  6. std::path::PathBuf,
  7. };
  8. #[test]
  9. #[ignore]
  10. fn bucket_map_test_mt() {
  11. let threads = 4096;
  12. let items = 4096;
  13. let tmpdir1 = std::env::temp_dir().join("bucket_map_test_mt");
  14. let tmpdir2 = PathBuf::from("/mnt/data/0").join("bucket_map_test_mt");
  15. let paths: Vec<PathBuf> = [tmpdir1, tmpdir2]
  16. .iter()
  17. .filter(|x| std::fs::create_dir_all(x).is_ok())
  18. .cloned()
  19. .collect();
  20. assert!(!paths.is_empty());
  21. let index = BucketMap::new(BucketMapConfig {
  22. max_buckets: 1 << 12,
  23. drives: Some(paths.clone()),
  24. ..BucketMapConfig::default()
  25. });
  26. (0..threads).into_par_iter().for_each(|_| {
  27. let key = Pubkey::new_unique();
  28. index.update(&key, |_| Some((vec![0u64], 0)));
  29. });
  30. let mut timer = Measure::start("bucket_map_test_mt");
  31. (0..threads).into_par_iter().for_each(|_| {
  32. for _ in 0..items {
  33. let key = Pubkey::new_unique();
  34. let ix: u64 = index.bucket_ix(&key) as u64;
  35. index.update(&key, |_| Some((vec![ix], 0)));
  36. assert_eq!(index.read_value(&key), Some((vec![ix], 0)));
  37. }
  38. });
  39. timer.stop();
  40. println!("time: {}ns per item", timer.as_ns() / (threads * items));
  41. let mut total = 0;
  42. for tmpdir in paths.iter() {
  43. let folder_size = fs_extra::dir::get_size(tmpdir).unwrap();
  44. total += folder_size;
  45. std::fs::remove_dir_all(tmpdir).unwrap();
  46. }
  47. println!("overhead: {}bytes per item", total / (threads * items));
  48. }