我有一个在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