是否可以在编译时填充大型集合?

问题描述 投票:2回答:3

我们有一个'删除所有数据'功能。我想从许多Web日志文件中删除一组IP。

目前在运行时,我打开一个带有要删除的IP地址的CSV,将其转换为集合,扫描文件,并在日志IP匹配时执行删除逻辑。

有什么办法可以加载CSV并在编译时把它变成一个集合吗?我们正在尝试将内容迁移到AWS lambda,只有一个静态二进制文件可以部署而没有依赖项,这很有意义。

rust
3个回答
4
投票

Rust-PHF crate提供编译时数据结构,包括(有序)映射和集合。

不幸的是,到目前为止,它不支持初始化一组std::net::IpAddr,但可以与静态字符串一起使用:

static IP_SET: phf::Set<&'static str> = phf_set! {
    "127.0.0.1",
    "::1",
};

2
投票

我建议只需使用Build Script读取CSV并生成一个源文件,其中包含一个标准HashSet的初始化,并带有自定义哈希(例如FxHash)。

这样可以让您保持编辑CSV文件的便利性,同时仍将所有数据烘焙到二进制文件中。它需要一些初始化时间(与PHF不同),但指定自定义散列的能力非常有用。

此外,根据日志中IP的格式,您可能希望存储&'static stru32;后者更有效(搜索方式),但如果需要转换,则可以否定增益。


2
投票

只有一个静态二进制文件要部署

使用include!include_str!内联整个CSV文件,然后照常执行其余程序。

use csv; // 1.0.5

static CSV_FILE: &[u8] = include_bytes!("/etc/hosts");

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut rdr = csv::ReaderBuilder::new()
        .delimiter(b'\t')
        .from_reader(CSV_FILE);

    for result in rdr.records() {
        let record = result?;
        println!("{:?}", record);
    }

    Ok(())
}

也可以看看:

© www.soinside.com 2019 - 2024. All rights reserved.