Реализовать район `as_parallel_slice`, используя итераторы - PullRequest
0 голосов
/ 29 июня 2018

У меня есть небольшая проблема:

extern crate rayon;
use rayon::prelude::*;

#[derive(Debug)]
struct Pixel {
    r: Vec<i8>,
    g: Vec<i8>,
    b: Vec<i8>,
}

#[derive(Debug)]
struct Node{
    r: i8,
    g: i8,
    b: i8,
}

struct PixelIterator<'a> {
    pixel: &'a Pixel,
    index: usize,
}

impl<'a> IntoIterator for &'a Pixel {
    type Item = Node;
    type IntoIter = PixelIterator<'a>;

    fn into_iter(self) -> Self::IntoIter {
        println!("Into &");
        PixelIterator { pixel: self, index: 0 }
    }
}

impl<'a> Iterator for PixelIterator<'a> {
    type Item = Node;
    fn next(&mut self) -> Option<Node> {
        println!("next &");
        let result = match self.index {
            0 | 1 | 2 | 3  => Node {
                r: self.pixel.r[self.index],
                g: self.pixel.g[self.index],
                b: self.pixel.b[self.index],
            },
            _ => return None,
        };
        self.index += 1;
        Some(result)
    }
}

impl ParallelSlice<Node> for Pixel {
    fn as_parallel_slice(&self) -> &[Node] {
        // ??
    }
}

fn main() {
    let p1 = Pixel {
        r: vec![11, 21, 31, 41],
        g: vec![12, 22, 32, 42],
        b: vec![13, 23, 33, 43],
    };

    p1.par_chunks(2).enumerate().for_each(|(index, chnk)| {
        for (cindex, i) in chnk.into_iter().enumerate(){
            println!("{:?}, {:?}", (index*2)+cindex, i);   
        }
    });
}

площадка

По сути, я хотел использовать функцию per_chunk Района, и для этого мне нужно было реализовать черту ParallelSlice. Мне интересно, что должно входить в функцию as_parallel_slice, чтобы я мог получить вывод в виде (порядок не имеет значения):

0 Node { 11, 12, 13} 
1 Node { 21, 22, 23}
2 Node { 31, 32, 33}
3 Node { 41, 42, 43}

Еще один глупый вопрос: as_parallel_slice ограничивает черту, чтобы вернуть срез, согласно моему пониманию в этом сценарии, мне нужно заранее иметь полные данные? Поскольку я работаю с последовательностями ДНК (которых может быть много данных), я полагаю, что должен вернуться к использованию перекрестной балки и итераторов вместо параллелизации на основе срезов через район, или это лучший способ сделать то же самое?

1 Ответ

0 голосов
/ 29 июня 2018

Вы не можете создать фрагмент Node с, если у вас нет куска непрерывной памяти, содержащего только Node с. Но у вас этого нет; данные из каждого Node лениво копируются из битов данных, хранящихся в трех отдельных Vec с.

Самый очевидный способ создания среза - это сначала создать все Node в Vec<Node>, а затем создать срез. Однако я подозреваю, что это именно то, что вы не хотите делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...