2个不稳定版本
0.2.0 | 2020年2月25日 |
---|---|
0.1.0 | 2020年2月10日 |
在 数据库接口 中排名 2259
每月下载量 60
用于 7 crate
7KB
CQLDb
轻量级、可扩展的基于数组的存储解决方案,目前包含以下开箱即用的存储类型(也支持自定义类型):
- I16(有符号16位整数)
- U64(无符号64位整数)
- F64(64位浮点数)
- NullableF64(可空64位浮点数)
- TinyText(255字符UTF-8字符串)
该项目通过将文件系统视为一个N维数组来工作,从而消除了查找项时扫描的需要。目前,必须在创建数据库时指定维数的数量,但是除了最后一个维数之外,每个维数都可以按需增长。
该项目最初是为了存储大量关系型时间序列数据而构建的,但我正在探索在我的其他项目中其他用途。
数据库已索引。
项目结构
该项目分为两个核心子项目,cql_db 和 cql_model,以及每个支持的类型在 cql_storage_types 文件夹中的子项目。
cql_db 子项目包含核心逻辑,协调特定类型的逻辑,以及基于数组的逻辑,允许整个系统作为一个数据库运行。它依赖于 cql_model 和 U64 类型。
cql_model 子项目包含由 cql_db 和存储类型消费的接口,并由所有子项目引用。
特定存储类型的子项目包含用于从文件中读取/写入特定类型的特定代码,并在 cql_model 子项目中实现接口。
要使用此项目,您需要导入 cql_db 子项目以及您想要使用的每个存储类型,或者如果您想使用其他类型,可以使用 cql_model 和您自己的 trait 实现。
下表中的 Rustdocs(带示例)和所有已发布组件的 crates 可以找到:
仓库链接 | crate | 文档 | 描述 |
---|---|---|---|
CQL Db | crates.io | docs.rs | 核心CQL数据库引擎 |
CQL Model | crates.io | docs.rs | 核心CQL数据库模型/接口 |
I16 | crates.io | docs.rs | 支持有符号16位整数存储 |
U64 | crates.io | docs.rs | 支持无符号64位整数存储 |
F64 | crates.io | docs.rs | 支持64位浮点数存储 |
NullableF64 | crates.io | docs.rs | 支持可空64位浮点数存储 |
TinyText | crates.io | docs.rs | 支持255字符UTF-8字符串存储 |
重大变更
由于该项目是一个针对文件系统的数据存储解决方案,一些变更可能会改变底层数据的预期结构,导致某个版本无法正确使用在不同版本上创建的数据库。直到版本1.0.0,副版本号(中间的数字)将递增,重大变更版本列在下面的表格中。如果您需要在这些版本之间升级,我建议您从较早版本中读取整个数据库,并将其写入新的数据库,新目标版本。我将在某个时候尝试改进这一点。请小心。
crate | 重大变更版本 | 描述 |
---|---|---|
cql_db | 0.2.0 | 在关键文件和数据库文件本身中做出的更改。提交 048e533 和 7dcaf7c |
入门指南
要开始,选择一个存储类型(例如使用U64),并将其添加到Cargo.toml中,同时添加核心cql_db crate
[dependencies]
//... (any existing dependencies you may have)
cql_db = "^0.2.4"
cql_u64 = "^0.2"
然后您需要创建一个文件夹,其中包含您想要数据库存放的位置,然后尝试以下内容
use std::io::{ Cursor, SeekFrom, Seek };
use cql_db::error::Error;
use cql_u64::{ U64, unpack_stream };
const DATABASE_LOCATION: &str = "PATH_TO_YOUR_DATABASE_DIRECTORY";
pub fn example_cql() -> Result<(), Error> {
// create a one dimensional database to hold 3 points
cql_db::create_db::<U64>(
DATABASE_LOCATION,
&[3]
)?;
// write '1', to [1]
cql_db::write_value::<U64>(
DATABASE_LOCATION,
&[1],
1
)?;
let mut result = [0; 2];
let mut stream = Cursor::new(Vec::new());
// read 2 values from [1] to 'stream'
cql_db::read_to_stream::<U64>(
DATABASE_LOCATION,
&mut stream,
&[1],
2
)?;
stream.seek(SeekFrom::Start(0)).unwrap();
unpack_stream(&mut stream, 2, |idx, value| {
result[idx] = value
})?;
assert_eq!(result[0], 1);
assert_eq!(result[1], 0);
Ok(())
}
更多示例可以在rustdocs中找到。
基准测试
以下提供了U64类型的基准测试,这些测试相当基础(且已四舍五入),旨在提供一个相对成本的粗略估计。完整的基准测试代码可以在github中找到,并可以使用rustup run nightly cargo bench
运行。其他类型的基准测试可以在相应类型的文档中找到。
操作 | 数据库维度 | 未检查的平均时间(ns) | 平均时间(ns) |
---|---|---|---|
单点读取 | 1 | 2 600 (+/- 300) | 7 500 (+/- 600) |
单点读取 | 4 | 15 400 (+/- 1 000) | 37 550 (+/- 2 300) |
单点写入 | 1 | 2 900 (+/- 200) | 7 700 (+/- 400) |
单点写入 | 4 | 16 000 (+/- 2 000) | 37 700 (+/- 3 000) |
流读取1点 | 1 | 2 600 (+/- 200) | 10 000 (+/- 850) |
流读取1点 | 4 | 16 000 (+/- 1 800) | 42 500 (+/- 6 500) |
流读取50,000点 | 1 | 28 000 000 (+/- 870 000) | 27 630 000 (+/- 180 000) |
流读取50,000点 | 4 | 28 200 000 (+/- 800 000) | 27 620 000 (+/- 480 000) |
许可证
许可协议为以下之一
- Apache许可证版本2.0(《LICENSE-APACHE》或《http://www.apache.org/licenses/LICENSE-2.0》)
- MIT许可证(《LICENSE-MIT》或《http://opensource.org/licenses/MIT》)
任选其一。
贡献
除非您明确声明,否则您有意提交的任何贡献,根据Apache-2.0许可证的定义,应当作为上述双重许可,不附加任何额外条款或条件。
lib.rs
:
此crate包含CQL数据库使用的核心模型和接口。
它不包含任何实现。