#csv #columns #offset #file-offset #access #partial #cached

csv-partial-cache

部分缓存的 Csv 索引

2 个不稳定版本

0.2.0 2023 年 12 月 6 日
0.1.0 2021 年 12 月 29 日

缓存 中排名第 106

MIT 许可证

19KB
277

License Crates.io Docs.rs

csv-partial-cache

部分缓存的 Csv 索引

旨在允许以高性能访问不可变的 csv 数据,而无需将其导入数据库。想法是将常用列的行偏移量保留在内存中,同时访问偏移量后面的完整行。

用法

假设我们有一个 http 状态表

code name description
100 Continue Status code 100 Continue 告诉你一部分 ...
101 切换协议 自 ... 以来已经创建了众多 HTTP 协议。

我们希望缓存短的 codename 列。

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