par_bridge (). map () останавливает и использует память вместо итерации? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь построчно прочитать поток объектов JSON из stdin и извлечь из них ключ «значение» в виде строки:

use rayon::prelude::*; // 1.0.3
use serde_json::Value; // 1.0.37
use std::io::{self, BufRead};
use std::sync::mpsc::channel;

fn main() {
    let stdin = io::stdin();

    let rx = {
        let (tx, rx) = channel();

        for line in stdin.lock().lines() {
            tx.send(line.unwrap()).unwrap();
        }

        rx
    };

    let it = rx.into_iter().par_bridge().map(|line| -> String {
        let v: Value = serde_json::from_str(&line.clone()).unwrap();
        let ret = v["value"].as_str().unwrap().into();
        println!("{}", ret);
        ret
    });

    eprintln!("Starting actual work.");
    it.for_each(|x| {
        println!("{}", x);
    });
}

eprintln!() никогда не вызывается иУ меня не хватает памяти, потому что я использую огромный файл в качестве ввода.Почему map() просто не возвращает итератор, который я мог бы использовать, а вместо этого ждет окончания ввода?

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