diff options
author | Lars Wirzenius <liw@liw.fi> | 2018-10-02 16:55:01 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2018-10-02 16:55:01 +0300 |
commit | 848a3fd22b5a4b8ab32b18c87229b0956c4e0336 (patch) | |
tree | 413a5c543ec9147d53934279e8174e2ffd9fa649 /src | |
parent | e1148bfa643f2eb63a5e35df9ce95c5469a2a160 (diff) | |
download | summainrs-848a3fd22b5a4b8ab32b18c87229b0956c4e0336.tar.gz |
Change: process in chunks of 4
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 46 |
1 files 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<DirEntry> = WalkDir::new(&dirname) - .into_iter() - .filter_map(|e| e.ok()) - .collect(); - let maps: Vec<Map> = 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<DirEntry> = 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<Map> = 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()); +} |