1个不稳定版本
0.1.0 | 2024年7月1日 |
---|
#702 在 数据库接口
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