implement working solution
parent
1cdc35562b
commit
351cceab7d
39
src/main.rs
39
src/main.rs
|
@ -240,37 +240,50 @@ fn main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// compute file hash in parallel
|
// compute file hash in parallel
|
||||||
let magic = files_candidate.lock().unwrap().len() / num_cpus::get();
|
let num_cpus = num_cpus::get();
|
||||||
println!("Magic is : {}", magic);
|
let files_candidate_len = files_candidate.lock().unwrap().len();
|
||||||
|
let chunk_size = (files_candidate_len / num_cpus) + 1;
|
||||||
|
let modulus = files_candidate_len % num_cpus;
|
||||||
|
|
||||||
for i in 0..num_cpus::get()+1 {
|
println!("Calculate {} file(s)", files_candidate_len);
|
||||||
|
println!("Use {} chunk(s) of size {}", modulus, chunk_size);
|
||||||
|
println!("Use {} chunk(s) of size {}", num_cpus - modulus, chunk_size - 1);
|
||||||
|
|
||||||
|
let mut guards = vec![];
|
||||||
let fc = files_candidate.clone();
|
let fc = files_candidate.clone();
|
||||||
let mut work = fc.lock().unwrap();
|
let mut work = fc.lock().unwrap();
|
||||||
let end = if (i*magic)+(magic) > work.len() {
|
|
||||||
work.len()
|
|
||||||
} else {
|
|
||||||
(i*magic)+(magic)
|
|
||||||
};
|
|
||||||
// Example from :
|
// Example from :
|
||||||
// https://stackoverflow.com/questions/33818141/how-do-i-pass-disjoint-slices-from-a-vector-to-different-threads
|
// https://stackoverflow.com%2Fquestions/33818141/how-do-i-pass-disjoint-slices-from-a-vector-to-different-threads
|
||||||
// Scoped threads allow the compiler to prove that no threads will outlive
|
// Scoped threads allow the compiler to prove that no threads will outlive
|
||||||
// table (which would be bad).
|
// table (which would be bad).
|
||||||
crossbeam::scope(|scope| {
|
crossbeam::scope(|scope| {
|
||||||
|
let (split_a, split_b) = work.split_at_mut(chunk_size * modulus);
|
||||||
|
let chunk_a = split_a.chunks_mut(chunk_size);
|
||||||
|
let chunk_b = split_b.chunks_mut(chunk_size - 1);
|
||||||
|
|
||||||
|
for (i, slice) in chunk_a.chain(chunk_b).enumerate() {
|
||||||
// Spawn a thread operating on that subslice.
|
// Spawn a thread operating on that subslice.
|
||||||
scope.spawn(move ||
|
let guard = scope.spawn(move || {
|
||||||
for w in &mut work[i*magic .. end] {
|
for w in slice {
|
||||||
println!("[{}] Hashing : {}", i, w);
|
println!("[{}] Hashing : {}", i, w);
|
||||||
|
//thread::sleep(std::time::Duration::from_secs(2));
|
||||||
if let Ok(mut file) = fs::File::open(&w.name) {
|
if let Ok(mut file) = fs::File::open(&w.name) {
|
||||||
w.hash::<Sha256, _>(&mut file);
|
w.hash::<Sha256, _>(&mut file);
|
||||||
} else {
|
} else {
|
||||||
panic!("Error opening file (name = {})!", w.name);
|
panic!("Error opening file (name = {})!", w.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
guards.push(guard);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for guard in guards {
|
||||||
|
guard.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
for i in files_candidate.lock().unwrap().iter() {
|
for i in work.iter() {
|
||||||
println!("{}", i);
|
println!("{}", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue