首页 > 解决方案 > 使用 Rayon 对哈希图进行分块

问题描述

是否可以使用 Rayon 将 HashMap 中的数据分块?我看到了几种分块方法,但它们似乎想要在切片(或类似的东西)上工作。

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

标签: rustrayon

解决方案


推荐阅读