Я пытаюсь построчно прочитать поток объектов 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()
просто не возвращает итератор, который я мог бы использовать, а вместо этого ждет окончания ввода?