1个不稳定版本

0.1.0 2024年7月1日

#702数据库接口

MIT 许可证

16KB
278

TextDb

TSV文件的只读数据库。

理由

排序后的文本文件可读性好,且可以像KV存储这样的二进制数据库一样快速运行。

如果您的数据主要静态,通常单个内存映射的文本文件是存储1TB区域及以上数据表的最简单和最快的方式。

您可以将TSV与JSON结合使用,以创建结构化存储,并添加布隆过滤器以及索引,以处理未排序数据和次级键。

您可以使用命令行工具(如'ls'、'grep'、'sed'和'awk')或使用Rust代码中的'writeln!'生成带有列的TSV(制表符分隔值)文件。

生成示例

    for i in 0..100 {
        println!("{i}\t{}", i*100);
    }

TSV文件在生物医学领域作为可能包含不同格式引号文本的模糊CSV文件的替代品被使用。

排序后的TSV文件是一个优秀的数据库,但当它们达到TB大小后,使用标准工具查询它们变得困难。

它们可能比RocksDB、SLED或MDBX数据库稍微大一点,但一旦磁盘缓存变暖,它们可以出奇地快。

使用字符串的简单示例

给定一个可能非常大的排序后的数据库,函数'get_matching_lines'可以返回一个范围项等于键的迭代器。

    use textdb::Table;

    let text = "A\nB\nC\nC\nD\nE\nF\nF\nF\nF\nF\nG\nH\nI\nJ\nK\nL\n";
    let textdb = Table::text_tsv_from_str(text);

    assert!(textdb.is_sorted().unwrap());

    assert_eq!(textdb.get_matching_lines("F".as_bytes()).count(), 5);
    assert_eq!(textdb.get_matching_lines("C".as_bytes()).count(), 2);

使用整数键的简单示例

请注意,键可以是一个字符串或任何实现了'FromStr'的Rust类型。

    use textdb::Table;

    let kv = [(6, 6), (10, 1), (113, 2), (113, 5), (129, 3), (140, 0), (168, 7), (205, 9), (211, 8), (215, 4)];
    let text = kv.iter().map(|(k, v)| format!("{k}\t{v}")).collect::<Vec<_>>().join("\n");
    let accessor = accessor::TsvParse::<u8, 0>::default();
    let map = maps::SafeMemoryMap::from_str(&text);
    let textdb = Table::new(map, accessor);

    // This would not be true for text order sorting.
    assert!(textdb.is_sorted().unwrap());

    assert_eq!(textdb.get_matching_lines(&113).count(), 2);

依赖关系

~170KB