summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-10-02 16:55:01 +0300
committerLars Wirzenius <liw@liw.fi>2018-10-02 16:55:01 +0300
commit848a3fd22b5a4b8ab32b18c87229b0956c4e0336 (patch)
tree413a5c543ec9147d53934279e8174e2ffd9fa649
parente1148bfa643f2eb63a5e35df9ce95c5469a2a160 (diff)
downloadsummainrs-848a3fd22b5a4b8ab32b18c87229b0956c4e0336.tar.gz
Change: process in chunks of 4
-rw-r--r--src/main.rs46
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());
+}