2 个不稳定版本
0.2.0 | 2023 年 12 月 6 日 |
---|---|
0.1.0 | 2021 年 12 月 29 日 |
在 缓存 中排名第 106
19KB
277 行
csv-partial-cache
部分缓存的 Csv 索引
旨在允许以高性能访问不可变的 csv 数据,而无需将其导入数据库。想法是将常用列的行偏移量保留在内存中,同时访问偏移量后面的完整行。
用法
假设我们有一个 http 状态表
code | name | description |
---|---|---|
100 | Continue | Status code 100 Continue 告诉你一部分 ... |
101 | 切换协议 | 自 ... 以来已经创建了众多 HTTP 协议。 |
我们希望缓存短的 code
和 name
列。
use csv_partial_cache::{self, CsvPartialCache, FromLineOffset};
/// Full table row representation
#[derive(serde::Deserialize)]
struct FullRecord {
code: u16,
name: String,
description: String,
}
/// Columns `code` and `name` are essential and small, so we'd like to keep them and memory
struct PartialRecord {
code: u16,
name: String,
// The file offset to access the full record data
offset: u16,
}
// We should tell a little more about the cached representation
impl FromLineOffset for PartialRecord {
/// type of file offsets used instead of default `u64` to spare some memory
type Offset = u16;
/// Pointer to the offset field
fn offset(&self) -> Self::Offset {
self.offset
}
/// Constructor from the line and it's offset
fn from_line_offset(line: &str, offset: Self::Offset) -> csv_partial_cache::Result<Self> {
let (code, name) = csv_line::from_str(line)?;
Ok(Self { code, name, offset })
}
}
tokio_test::block_on(async {
// Now we can load the index
let cache = CsvPartialCache::<PartialRecord>::new("tests/status_codes.csv").unwrap();
// Getting a partial data cached in memory
let partial = cache.find(&100, |x| x.code).unwrap();
assert_eq!(partial.name, "Continue");
/// Loading full data from the csv file
let full: FullRecord = cache.full_record(&partial).await.unwrap();
assert_eq!(full.code, partial.code);
})
贡献
我们欢迎所有类型的贡献,谢谢!
关于 README 的说明
大多数 README 文件是通过 cargo-sync-readme 从 crate 文档自动复制的。这样,README 总是与文档同步,并且示例经过测试。
因此,如果您想更改在 <!-- cargo-sync-readme start -->
和 <!-- cargo-sync-readme end -->
标记之间的 README 文件的一部分,请不要直接编辑 README.md
,而是更改 src/lib.rs
顶部的文档,然后使用以下命令同步 README 文件:
cargo sync-readme
(请确保已安装 cargo 命令)
cargo install cargo-sync-readme
如果您已安装 rusty-hook,则更改将在提交时自动应用。
许可证
本项目采用 MIT 许可证。
依赖项
~4–6MB
~92K SLoC