# Materialize 与 Streaming `sqzc3d` 支持两种访问模型,它们都能得到一致的语义(layout/validity/units),差异在于资源与交付形态: 30 秒版本: - Materialize:一次性读入并产出数组。大多数用户默认就用它。 - Streaming:保持文件打开,按需读到你提供的 buffer。只有在内存很紧或 I/O 很特殊时才需要。 形象化:Materialize 像把整张表读进来;Streaming 像需要哪几行就读哪几行。 ## Materialize:一次性内存化为 `Chunk` Materialize 的特点: - 解析 C3D payload。 - 分配紧凑的连续数组。 - 返回一个 `Chunk`,包含: - `points_xyz`: `(T, P, 3)` `float64`(frame-major) - `points_valid`: `(T, P)` `uint8` - 可选的 `analogs`: `(C, N)` `float64`(channel-major) 这适合大多数分析/仿真场景:加载一次,后续反复切片/计算都很快。 Python easy 层(`read -> View`)与 C API(`sqzc3d_build_chunks`)走的都是这条路径。 ## Streaming:只保留头信息,按需读入用户缓冲区 Streaming 的特点: - 解析 header + parameters + labels。 - 保持文件打开。 - 按需从文件读取 frames/windows/trajectories。 该模式通过 `include/sqzc3d_c3d_stream.h` 中的 C++ API 暴露。 典型用例(更偏“工程约束”而不是“更好用”): - 极端内存受限环境。 - 虚拟文件系统(例如浏览器 WASM file APIs)。 - 只需要读取小窗口/少量帧,不想把全量数据放进内存。 ## 如何选择 - 优先用 Materialize:语义最直观、数组最友好、也更符合 Python 用户心智。 - 需要极低内存或特殊 I/O 才用 Streaming:你需要自己管理输出 buffer,并显式选择读取的窗口。 Units: - 默认情况下,Streaming 返回 raw point units(见 Units);如果下游需要某个单位,可显式请求缩放。