包含大型源文件以初始化Trie结构的Rust板条箱无法编译(OOM)

时间:2019-05-27 13:23:53

标签: rust

我有一个在Trie中实现的Rust结构,我从其他人那里获得了它,而且似乎工作得很好:

pub struct Trie<K, V>
where
    K: std::fmt::Debug + Eq + Hash + Clone,
    V: std::fmt::Debug + Clone,
{
    value: Option<V>,
    children: HashMap<K, Trie<K, V>>,
}

impl<K, V> Trie<K, V>
where
    K: std::fmt::Debug + Eq + Hash + Clone,
    V: std::fmt::Debug + Clone,
{
    pub fn new() -> Trie<K, V> {
        Trie {
            value: None,
            children: HashMap::new(),
        }
    }

    pub fn insert(&mut self, path: Vec<K>, v: V) {
        if path.is_empty() {
            match self.value {
                Some(_) => panic!("key exists"),
                None => {
                    self.value = Some(v);
                }
            }
            return;
        }

        self.children
            .entry(path[0].clone())
            .or_insert(Trie::new())
            .insert(path[1..].to_vec(), v)
    }

    pub fn fetch_or_default(&self, path: Vec<K>, default: V) -> V {
        let value = self.value.clone().unwrap_or(default);
        match path.len() {
            0 => value,
            _ => match self.children.get(&path[0]) {
                Some(child) => child.fetch_or_default(path[1..].to_vec(), value),
                None => value,
            },
        }
    }
}

我有一个特殊的文件,在该文件中,我根据包含150k个单词的字典初始化Trie实例,并为每个字典分配一个0到150之间的数字。

数据是通过JavaScript生成的,因此它不是像不可能的那样庞大,但是由于某些原因,Rust编译无法处理它,并且崩溃了,尽管我的计算机具有16Gb内存+ 2Gb交换空间(在崩溃前完全使用了它) )。

use crate::data::*;

/*
a.reduce((str,ai,i) => { return str + ai.map((w,i) => `    //${w}\n    words_trie.insert(vec![' ',${w.split('').reverse().map(c => `'${c==`'`?`\\`:''}${c}'`).join(',')}], ${i});`).join('\n') + '\n' }, '');
*/

pub fn into(words_trie: &mut Trie<char, usize>) {
    // SPECIAL LINE, DO NO REPLACE BY ABOVE FORMULA
    words_trie.insert(vec![], 150);
    // ================================================
    //'n
    words_trie.insert(vec![' ', 'n', '\''], 0);
    ...
    //(150 000 times a comment followed by an insertion line)
    ...
}

我收到的错误消息是以下内容,但这只是OOM的杀手at:

process didn't exit successfully: `rustc --edition=2018 --crate-name postag_nl_v1 src/main.rs --color always --crate-type bin --emit=dep-info,link -C debuginfo=2 -C metadata=f33cf4c96979227f -C extra-filename=-f33cf4c96979227f --out-dir /home/fremy/Documents/postag_nl_v1/target/debug/deps -C incremental=/home/fremy/Documents/postag_nl_v1/target/debug/incremental -L dependency=/home/fremy/Documents/postag_nl_v1/target/debug/deps` (signal: 9, SIGKILL: kill)

如何在不使编译器崩溃的情况下基于字典初始化Trie?

  

[编辑]这是最小复制,带有伪数据:

     

https://gist.github.com/FremyCompany/1f6132441338f8b219d961c7254bd8ac#file-main-rs

     

https://1drv.ms/u/s!AhVrPgyThAkTgQ8v2U99Ffzug7rJ [1Mb zip]

0 个答案:

没有答案