当我有一个大的HashMap文字时,如何改善编译时间?

时间:2016-02-05 16:48:47

标签: rust

我有一个非常大的物理测量HashMap(300k + 3元素元组的条目),我想将其保留为HashMap(我可以将它移到SQLite数据库并进行查询,但我和#39; d而不是,出于性能原因)。将它作为文字包括使编译时间...很长。 有更好的方法吗?我可以用二进制格式将它序列化到磁盘,并在二进制执行/加载库时将其加载为HashMap吗?使用子集进行开发和测试工作正常,但我需要生产的完整数据......

2 个答案:

答案 0 :(得分:4)

如果您可以使用较小的数据集进行开发和测试,那么您可以使用条件编译。这是一个简单的例子:

#[cfg(debug_assertions)]
const VALUE: u32 = 0;

#[cfg(not(debug_assertions))]
const VALUE: u32 = 1;

fn main() {
    println!("value: {}", VALUE);
}

如果你在没有优化的情况下编译它(“调试”模式),那么debug_assertions将为真,VALUE将等于0,但如果你用优化(“发布”模式)编译它),然后debug_assertions将为false,VALUE将等于1.

这非常好地映射到Cargo的调试和发布模式(cargo buildcargo build --release),因此这样可以使您的地图缩小以进行调试构建,并使其成为发布版本的完整大小。

当然,也可以将数据序列化并加载回来。您可以使用大量库进行自动序列化,例如bincoderustc_serialize::jsonserde_json。如果你想知道应该如何使用这些库,那么你应该问另一个问题,如果他们的文档由于某种原因不够清楚。

答案 1 :(得分:4)

所以你要对哈希映射进行硬编码?这似乎是一个完美的哈希问题,请参阅https://github.com/sfackler/rust-phf箱子。

至于编译时间,将哈希表卸载到一个单独的包中,Cargo只会在哈希表数据发生变化时重新编译此包。