首页 > 解决方案 > par_bridge().map() 停止并消耗内存而不是迭代?

问题描述

我正在尝试从标准输入中逐行读取 JSON 对象流,并从它们中提取“值”键作为字符串:

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()不只返回一个我可以使用的迭代器,而是等待它的输入结束?

标签: rustrayon

解决方案


推荐阅读