Используйте его для фрагментации хэш — карты

#rust #rayon

Вопрос:

Можно ли использовать Rayon для объединения данных в хэш-карту? Я вижу несколько методов фрагментации, но они, похоже, хотят работать над срезом (или чем-то подобным).

 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);
  });
 

vec Код компилируется без ошибок, но все HashMap попытки заканчиваются неудачей с ошибками «без имени метода ... «.

Изменить: Вопрос о том, как использовать существующий итератор с районом, не отвечает на этот вопрос. Этот вопрос заключается в том, как получить итератор, который разбивает хэш-карту на части.

Ответ

Способ разбиения хэш-карты на части заключается в следующем:

 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> = (amp;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);
}

 

Комментарии:

1. вы можете использовать мост из существующего итератора, который вы можете получить с карты

2. Есть ли способ разделить хэш-карту на части? bar.chunks(3) это ошибка компиляции.