From 848a3fd22b5a4b8ab32b18c87229b0956c4e0336 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Tue, 2 Oct 2018 16:55:01 +0300 Subject: Change: process in chunks of 4 --- src/main.rs | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index d49266b..a4501cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,24 +17,42 @@ type Map = BTreeMap<&'static str, String>; fn main() -> io::Result<()> { + let nproc = 4; for dirname in env::args().skip(1) { - let maps: Vec = WalkDir::new(&dirname) - .into_iter() - .filter_map(|e| e.ok()) - .collect(); - let maps: Vec = maps - .into_par_iter() - .map(mkmap) - .collect(); - for map in maps { - println!("{}", serde_yaml::to_string(&map).unwrap()); - } + summain(&dirname, nproc); } Ok(()) } -fn mkmap(e: DirEntry) -> Map { +fn summain(dirname: &str, nproc: usize) { + let mut chunk: Vec = vec![]; + let entries = WalkDir::new(dirname) + .into_iter() + .filter_map(|e| e.ok()); + + for entry in entries { + chunk.push(entry); + if chunk.len() == nproc { + process_chunk(&chunk); + } + } + + if chunk.len() > 0 { + process_chunk(&chunk); + } +} + + +fn process_chunk(chunk: &[DirEntry]) { + let chunk: Vec = chunk.into_par_iter().map(mkmap).collect(); + for map in chunk { + print_map(map); + } +} + + +fn mkmap(e: &DirEntry) -> Map { let fields = vec![ ("Name", format::name(&e)), ("Mtime", format::mtime(&e)), @@ -58,3 +76,7 @@ fn mkmap(e: DirEntry) -> Map { } map } + +fn print_map(map: Map) { + println!("{}", serde_yaml::to_string(&map).unwrap()); +} -- cgit v1.2.1