#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)
это ошибка компиляции.