我有一个非常大的物理测量HashMap(300k + 3元素元组的条目),我想将其保留为HashMap(我可以将它移到SQLite数据库并进行查询,但我和#39; d而不是,出于性能原因)。将它作为文字包括使编译时间...很长。 有更好的方法吗?我可以用二进制格式将它序列化到磁盘,并在二进制执行/加载库时将其加载为HashMap吗?使用子集进行开发和测试工作正常,但我需要生产的完整数据......
答案 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 build
和cargo build --release
),因此这样可以使您的地图缩小以进行调试构建,并使其成为发布版本的完整大小。
当然,也可以将数据序列化并加载回来。您可以使用大量库进行自动序列化,例如bincode或rustc_serialize::json或serde_json。如果你想知道应该如何使用这些库,那么你应该问另一个问题,如果他们的文档由于某种原因不够清楚。
答案 1 :(得分:4)
所以你要对哈希映射进行硬编码?这似乎是一个完美的哈希问题,请参阅https://github.com/sfackler/rust-phf箱子。
至于编译时间,将哈希表卸载到一个单独的包中,Cargo只会在哈希表数据发生变化时重新编译此包。