#cql #storage #nosql #array

cql_model

CQL数据库的核心模型/接口 - 一种轻量级基于数组的数据库

2个不稳定版本

0.2.0 2020年2月25日
0.1.0 2020年2月10日

数据库接口 中排名 2259

Download history 15/week @ 2024-03-11 15/week @ 2024-03-18 33/week @ 2024-03-25 77/week @ 2024-04-01 8/week @ 2024-04-08 15/week @ 2024-04-15 18/week @ 2024-04-22 13/week @ 2024-04-29 19/week @ 2024-05-06 15/week @ 2024-05-13 15/week @ 2024-05-20 6/week @ 2024-05-27 12/week @ 2024-06-03 16/week @ 2024-06-10 12/week @ 2024-06-17 20/week @ 2024-06-24

每月下载量 60
用于 7 crate

MIT/Apache

7KB

CQLDb

轻量级、可扩展的基于数组的存储解决方案,目前包含以下开箱即用的存储类型(也支持自定义类型):

  • I16(有符号16位整数)
  • U64(无符号64位整数)
  • F64(64位浮点数)
  • NullableF64(可空64位浮点数)
  • TinyText(255字符UTF-8字符串)

该项目通过将文件系统视为一个N维数组来工作,从而消除了查找项时扫描的需要。目前,必须在创建数据库时指定维数的数量,但是除了最后一个维数之外,每个维数都可以按需增长。

该项目最初是为了存储大量关系型时间序列数据而构建的,但我正在探索在我的其他项目中其他用途。

数据库已索引。

项目结构

该项目分为两个核心子项目,cql_dbcql_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 在关键文件和数据库文件本身中做出的更改。提交 048e5337dcaf7c

入门指南

要开始,选择一个存储类型(例如使用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许可证的定义,应当作为上述双重许可,不附加任何额外条款或条件。


lib.rs:

此crate包含CQL数据库使用的核心模型和接口。

它不包含任何实现。

无运行时依赖