我们有一个'删除所有数据'功能。我想从许多Web日志文件中删除一组IP。
目前在运行时,我打开一个带有要删除的IP地址的CSV,将其转换为集合,扫描文件,并在日志IP匹配时执行删除逻辑。
有什么办法可以加载CSV并在编译时把它变成一个集合吗?我们正在尝试将内容迁移到AWS lambda,只有一个静态二进制文件可以部署而没有依赖项,这很有意义。
Rust-PHF crate提供编译时数据结构,包括(有序)映射和集合。
不幸的是,到目前为止,它不支持初始化一组std::net::IpAddr
,但可以与静态字符串一起使用:
static IP_SET: phf::Set<&'static str> = phf_set! {
"127.0.0.1",
"::1",
};
我建议只需使用Build Script读取CSV并生成一个源文件,其中包含一个标准HashSet
的初始化,并带有自定义哈希(例如FxHash
)。
这样可以让您保持编辑CSV文件的便利性,同时仍将所有数据烘焙到二进制文件中。它需要一些初始化时间(与PHF不同),但指定自定义散列的能力非常有用。
此外,根据日志中IP的格式,您可能希望存储&'static str
或u32
;后者更有效(搜索方式),但如果需要转换,则可以否定增益。
只有一个静态二进制文件要部署
使用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(())
}
也可以看看: