2 个版本

0.1.1 2024 年 3 月 24 日
0.1.0 2024 年 3 月 21 日

#37 in #字节流

44 每月下载量
用于 idntkown

MIT 许可协议

350KB
5.5K SLoC

pstream

自行承担风险使用。

基于块存储的持久字节流。

许可协议

根据 MIT 许可协议 许可。

贡献

除非你明确表示,否则任何有意提交以包含在作品中并由你提交的贡献,都应按照 MIT 许可协议许可,不附加任何额外条款或条件。


lib.rs:

基于块存储的持久字节流。

最初的想法是拥有一个用于编写可靠持久软件的原始类型,字节流似乎是一个很好的起点 - 它可以用作更简单软件的主要存储,并在更复杂的系统中占有一席之地。

字节流有众多应用:数据库的预写日志、消息代理、任何类型的日志、持久缓冲区等。我认为它是一个通用、高效且易于推理的结构。几乎任何类型的数据存储都可以用这种方式建模,只要数据适合内存,这是该库的主要限制。

目标是保持库 简单,以便代码可以通过检查进行推理并易于维护,同时 API 足够灵活,可以覆盖各种用例。简单通常也导致更好的性能和可靠性。它设计用于在并发代码中使用。

由于二级存储是基于块的,核心抽象是连续的字节流,由块支持,然后进一步用于构建概念上无限制的数据流。有关详细信息,请参阅相关模块文档。

功能

此库旨在最小化,因此不属于核心实现的额外功能位于 Cargo 功能 后面,以进行条件编译。以下功能可用

  • io-filesystem - 包括基于通用文件系统的块流存储实现。
  • libc - 如果启用,基于文件的 I/O 将使用更高效和可靠的 Linux 内核调用。仅适用于 Linux。

示例

use std::io;

use pstream::{EndlessStream, io::Void};

fn main() -> io::Result<()> {
    let void = Void::new(10, 17);
    let stream = EndlessStream::new(void);
    stream.grow()?;
    let data = [10u8; 8].as_slice();
    stream.append(data)?;
    for chunk in stream.iter() {
        assert_eq!(chunk.bytes().unwrap().as_ref(), data);
    }
    Ok(())
}

依赖关系

~130KB