Skip to content

Repository files navigation

asterstore

本地文件数据管理库
轻量读取 · 显式发布 · 可恢复治理

CI Python 3.11+ Apache-2.0

快速开始 · API · 示例 · 设计 · 参与贡献


数据仍然是普通文件。asterstore 为它们管理发布、保留与回收:哪些文件组成一次发布,哪些对象仍被任务使用,哪些残留可以清理。

框架负责生产数据,Polars、Arrow 等引擎负责读取和计算。asterstore 连接这些环节,核心无第三方运行依赖,也不依赖 Aster 或任何业务框架。

治理明确,读取轻量

  • 发布有边界。 写入候选后显式提交,以原子切换使新发布可见;未变化的受管对象可以直接复用。
  • 读取走短路径。 打开当前发布只读两份控制记录;绑定后反复选择文件路径,不扫描目录、不逐文件预检、不计算内容哈希。
  • 保留由任务决定。 需要的发布显式保留,使用完成后按引用版本释放;绑定或读取本身不产生保留记录。
  • 回收可以恢复。 先预览,再按固定计划退役与删除;中断后沿原计划恢复,清理范围不扩大。

两种管理方式,同一套模型

外部登记 · registered 受管发布 · managed
数据由谁写入 现有程序或其他框架 通过候选写入与提交
如何接入 声明已有文件及资源位置 创建对象,或复用已提交对象
可以保留什么 发布元数据 发布元数据与受管文件
文件由谁回收 外部生产者 asterstore 按权属和保留关系回收

两者共用 Declaration、Binding 和治理接口。登记外部文件不会改变其生产流程,也不会赋予库删除权。详见声明与资源绑定。

快速开始

从源码体验,需要 Python 3.11+ 和 uv:

git clone https://github.com/Aequiludium/asterstore.git
cd asterstore
uv sync --locked

写入一次,显式发布。 将下面代码保存为 demo.py,运行 uv run python demo.py:

from asterstore import Repository

store = Repository("./demo-store")
store.initialize(
    resource_ids=["data"],
    managed_resource_id="data",
    lifecycle=True,
)

with store.prepare(
    "measurements",
    publication_id="run:1",
    operation_id="write:1",
    expected_generation=0,
) as writer:
    writer.write_bytes("readings", b"sensor,value\nA,21.5\n", relative_path="part.csv")
    writer.commit()

# 捕获这次发布的成员与路径,交给文件读取或数据引擎。
binding = store.open("measurements")
print(binding.files(keys=["readings"])[0].read_text())

operation_id 标识一次固定写入请求,expected_generation 用于检测并发更新。退出候选上下文不会自动提交;完整的复用与恢复流程见发布示例。

任务需要保留数据时

在可能并发回收的场景中,先建立对象保留,再通过该引用读取。以下代码接续上面的示例:

from asterstore import RetentionScope

held = store.governance.retain("analysis", "measurements", "run:1", scope=RetentionScope.OBJECTS)
try:
    inputs = store.governance.open("analysis", expected_revision=held.revision)
    print(inputs.files()[0].read_text())
finally:
    store.governance.release("analysis", expected_revision=held.revision)

释放引用不会立即删除文件。回收需显式调用,且仍保护当前发布及其他任务保留的对象。参见治理示例与候选清理。

使用 Polars,可直接运行增量发布、延迟查询与回收的完整示例:

uv sync --locked --extra polars
uv run --locked --extra polars python examples/parquet.py

文档导航

想了解什么 从这里开始
使用接口与读取引擎 API · 引擎接入 · 示例
发布、保留与回收如何工作 发布 · 治理 · 候选清理
模型与磁盘格式 设计原则 · 项目结构 · 协议
开发、验证与贡献 开发指南 · 性能验证 · 贡献指南

项目状态

0.1.0 首版发布准备中。已完成 Aster 真实分钟行情的本地受管接入,验证发布、增量复用、读取、保留与回收;详见接入验收。PyPI 上传完成前,请继续使用源码。

当前验证范围为本地 Linux/POSIX;NFS 等共享挂载需要单独验证。核心以单个数据集发布为提交单位,控制历史尚未压缩。支持范围与后续工作见首版范围、路线图及开发格式边界。


Apache-2.0 · 变更记录 · 安全报告 · 问题反馈

About

Local file-based data lifecycle management with lightweight reads and explicit retention.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages