multithreading improvements

This commit is contained in:
sreedevk
2025-07-12 18:26:10 +00:00
parent f9e86f8522
commit 1b06eb8e85
4 changed files with 92 additions and 74 deletions

View File

@@ -2,20 +2,21 @@ use anyhow::Result;
use dashmap::DashMap;
use indicatif::{ParallelProgressIterator, ProgressBar, ProgressFinish, ProgressStyle};
use rayon::prelude::{IntoParallelIterator, ParallelIterator};
use std::sync::{Arc, Mutex};
use std::{borrow::Cow, time::Duration};
use crate::fileinfo::FileInfo;
#[derive(Debug, Clone)]
pub struct Processor {
pub files: Vec<FileInfo>,
pub files: Arc<Mutex<Vec<FileInfo>>>,
pub hashwise_results: DashMap<String, Vec<FileInfo>>,
pub sizewise_results: DashMap<u64, Vec<FileInfo>>,
pub max_path_len: usize,
}
impl Processor {
pub fn new(files: Vec<FileInfo>) -> Self {
pub fn new(files: Arc<Mutex<Vec<FileInfo>>>) -> Self {
Self {
files,
hashwise_results: DashMap::new(),
@@ -25,14 +26,19 @@ impl Processor {
}
pub fn hashwise(&mut self) -> Result<()> {
if self.sizewise_results.is_empty() {
let flist_size = {
let f = self.files.lock().unwrap();
f.len()
};
if flist_size < 1 {
return Ok(());
}
let progress_style = ProgressStyle::with_template(
"[{elapsed_precise}] {bar:40.cyan/blue} {pos:>7}/{len:7} {msg}",
)?;
let progress_bar = ProgressBar::new(self.files.len() as u64);
let progress_bar = ProgressBar::new(flist_size as u64);
progress_bar.set_style(progress_style);
progress_bar.enable_steady_tick(Duration::from_millis(50));
progress_bar.set_message("indexing file hashes");
@@ -72,26 +78,35 @@ impl Processor {
}
pub fn sizewise(&mut self) -> Result<()> {
if self.files.is_empty() {
let flist_size = {
let f = self.files.lock().unwrap();
f.len()
};
if flist_size < 1 {
return Ok(());
}
let progress_style = ProgressStyle::with_template(
"[{elapsed_precise}] {bar:40.cyan/blue} {pos:>7}/{len:7} {msg}",
)?;
let progress_bar = ProgressBar::new(self.files.len() as u64);
let progress_bar = ProgressBar::new(flist_size as u64);
progress_bar.set_style(progress_style);
progress_bar.enable_steady_tick(Duration::from_millis(50));
progress_bar.set_message("indexing file sizes");
self.files
.clone()
(0..flist_size)
.into_par_iter()
.progress_with(progress_bar)
.with_finish(ProgressFinish::WithMessage(Cow::from(
"indexed files sizes",
)))
.for_each(|file| {
.for_each(|findex| {
let file = {
let files = self.files.lock().unwrap();
files[findex].clone()
};
self.sizewise_results
.entry(file.size)
.and_modify(|fileset| fileset.push(file.clone()))