Linshu 自有格式
面向侵入式、半侵入式、非侵入式脑机接口数据的通用容器格式标准。
定位
Linshu 自有格式是完全自全的通用层次化数据容器,借鉴 NWB 的程序设计理念并进行现代化重构,致力于取代 NWB。
Linshu 提供 S3 云存储、Zarr v2/v3 自适应、pydantic 类型安全等现代化能力。
格式要求
- 支持对象存储,S3协议,尽可能兼容云、分布式处理。
- Python友好,pythonic编程实现。
- 可完整承载 NWB 文件作为数据单元,支持与 pynwb 互操作。
- 支持软链接:文件的某个字段可指向另一个完整Linshu文件。打开父文件时不立即加载外部数据,用户访问该字段时触发按需读取。大数据与元数据分离存储由用户自行决策,Linshu提供功能保障。
- 数据格式及大多数函数方法、类可以通过mypy、pyright直接从代码进行静态推断,代码即格式。
- 实现高并发、细粒度的IO操作,支持zarr局部修改写入。
数据字段类型与 Zarr 映射
| 字段类型 | Zarr 存储位置 | 说明 |
|---|---|---|
| 字符串(含软链接路径) | Group attribute | zarr.json 的 attributes 字典 |
| 整型数字 | Group attribute | 同上 |
| 浮点数字 | Group attribute | 同上 |
| 布尔类型 | Group attribute | 同上 |
| 日期时间(Python datetime) | Group attribute | ISO 8601 字符串 |
| Numpy Array | Array | Zarr Array,chunk策略可配置 |
| Pandas Dataframe | Sub-group | 存储布局参数化:row_wise(按行组切块)用于行为/时间序列型数据;column_wise(每列一个Zarr Array)用于事件/变量型数据 |
| 嵌套 pydantic Model | Sub-group | 递归进入,其标量字段成为该 group 的 attribute |
相比于NWB作出的改变
- 代码即规范。
- 使用pydantic取代JSON schema、@register_class、nwbfields、@docval。
- 直接 Container 到存储的映射,消除Builder层,IO 后端对 zarr v2 / v3 自适应(行为矩阵见下文)。pydantic模型树定义规范结构,薄映射层遍历模型树按字段类型分派到Zarr原子操作;pydantic模型不承载序列化逻辑。读取采用代理对象惰性加载(打开文件仅解析根结构),写入仅更新实际变更部分。pydantic模型树层级直接映射为Zarr目录层级。
- 不支持用户弹性扩展规范。不提供YAML驱动类生成、NWBNamespaceBuilder、entry-point插件发现、命名空间注册表等形式化插件设施。规范升级通过pydantic Python类继承在内部完成,外部用户可通过fork仓库自行开发。
- 每个字段赋予全局唯一数值 ID(整个规范中所有类型的所有字段共享同一ID空间),构建时由工具自动生成并持久化于锁定文件。ID基于字段在模型树中的限定路径和名称确定性派生,字段位置与名称不变则ID跨版本保持一致。
- Linshu格式规范采用语义化版本(SemVer),记录于Zarr根group的attribute中。
Zarr 版本行为矩阵(zarr v2 / v3 自适应)
Linshu 的 IO 层(core/_zarr_compat.py 门面)不写死 zarr 主版本,而是在运行时探测当前环境的 zarr 库,并按其能力读写对应格式。行为取决于运行环境的 zarr 版本与磁盘文件的格式:
| 环境 | 默认写入格式 | 读取 v2 文件 | 读取 v3 文件 | 请求格式不可达时 |
|---|---|---|---|---|
zarr>=3(如 3.2.1) |
zarr v3(规范格式) | ✅ 自动探测,正常读回 | ✅ 正常读回 | 无(v3 环境两种格式均可) |
zarr==2.18.x |
zarr v2(写非规范格式,发 UserWarning) |
✅ 正常读回 | ❌ 主动抛 ZarrFormatError |
请求 zarr_format=3 → ZarrFormatError |
要点:
- 默认写格式 = 当前环境原生格式。zarr v3 环境下默认写出规范格式 v3;zarr v2 环境下默认写出 v2,并发出
UserWarning提示当前环境无法产出规范格式。 - 读取自动探测:v3 环境可读 v2 / v3 两种文件;v2 环境遇 v3 文件主动抛
ZarrFormatError(而非含糊的底层错误)。 - 原地写回保持来源格式:
from_zarr读回时记录来源格式(_source_format),write(inplace=True)保持该格式,绝不静默迁移。
zarr_format 参数
Model.write(path=..., zarr_format=...) 接受 None / 2 / 3:
None:新路径 → 当前环境默认格式(v3 环境为 3,v2 环境为 2 并警告);原地写回 → 保持来源格式。- 显式
2/3:指定目标格式。原地写回且与来源格式不同时为显式迁移,发出UserWarning提示。 - 传非法值(如
4)→ValueError(参数校验,两种库环境下行为一致)。 - zarr v2 环境请求
zarr_format=3→ZarrFormatError(当前环境无法读写 v3 格式的 store)。
ZarrFormatError
RuntimeError 子类,表示目标 zarr 格式在当前环境不可达(如 zarr v2 环境请求 v3 格式)。消息包含当前 zarr 版本、被请求格式与解决办法。读取入口(from_zarr)与写入入口(resolve_format)均会触发该异常。
TODOs
- 软链接支持
- 基于zarr的加密
- 提供对SpikeInterface的良好支持
Metadata
Release files for linshu-format 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| linshu_format-1.0.1.tar.gz | 137.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| linshu_format-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 218.9 kB
Release files / linshu_format-1.0.1.tar.gz
| Download URL | linshu_format-1.0.1.tar.gz |
|---|---|
| Size | 137.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bbd590fdc966ccd52704d705a7dcace1f285fe63bb3ebec51cf77d305b387ee6
|
|
BLAKE2b-256 checksum How to use checksums |
f8b51e81cd4881a3bd3cbeb75b4e3098189af8ae5528c9bed909ee72ddf55dcb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / linshu_format-1.0.1-py3-none-any.whl
| Download URL | linshu_format-1.0.1-py3-none-any.whl |
|---|---|
| Size | 81.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e6cd286aa0377258f2a210604a095285721334ebda9698930bc6c23183788dfe
|
|
BLAKE2b-256 checksum How to use checksums |
af4bdd6be671d31254b9cca2fe43fcfddb9cc85f87539d62d628c5c880326f88
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|