代码之家  ›  专栏  ›  技术社区  ›  d33tah

par_bridge()。map()停止并消耗内存,而不是迭代?

  •  0
  • d33tah  · 技术社区  · 7 年前

    我试图从stdin中逐行读取JSON对象流,并从中提取“value”键作为字符串:

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

    0 回复  |  直到 7 年前
    推荐文章