0

Is it possible to use Rayon to chunk the data in a HashMap? I see several chunking methods, but they seem to want to work on a slice (or something similar).

use rayon::prelude::*;
use std::collections::HashMap;
use log::info;

fn main() {
  let foo = vec![1, 2, 3, 4, 5, 6, 7, 8];
  foo.par_chunks(3).for_each(|x| {
       info!("x: {:?}", x);
  });

  let bar = HashMap::<String, String>::default();
  bar.par_chunks(3).for_each(|x| {
       info!("x: {:?}", x);
  });
  bar.chunks(3).for_each(|x| {
       info!("x: {:?}", x);
  });
  bar.par_iter().chunks(3).for_each(|x| {
       info!("x: {:?}", x);
  });

The vec code compiles without error, but all o the HashMap attempts fail with "no method named ..." errors.

Edit: The question about how to use an existing iterator with rayon does not answer this question. This question is how to get an iterator that chunks a hash map.

Answer

The way to chunk a hash map is the following:

use itertools::Itertools;
use std::collections::HashMap;

fn main() {
    let mut m: HashMap<usize, usize> = HashMap::default();
    for n in 0..100 {
        m.insert(n, 2 * n);
    }
    println!("m: {:?}", m);

    let res: HashMap<usize, usize> = (&m)
        .into_iter()
        .chunks(7)
        .into_iter()
        .map(|c| c.map(|(a, b)| (a + b, b - a)))
        .flatten()
        .collect();

    println!("M still usable: {}", m.len());
    println!("res: {:?}", res);
}

Troy Daniels
  • 3,270
  • 2
  • 25
  • 57

0 Answers0