
本文翻译自 LanceDB Blog
作者:Weston Pace
Lance 文件格式 2.1 此前已以测试版形式推出,如今我们欣喜地宣布,该版本正式进入稳定阶段。
这意味着:其一,我们已完善并公开该版本的正式文档;其二,未来所有可能影响兼容性的破坏性更新,都将统一规划至 2.2 版本中;同时,我们承诺将持续保障 2.1 版本的向后兼容性。
文档链接:https://lancedb.github.io/lance/format/file/encoding/
💡 核心信息速览:
1. 2.1 版本现已稳定,对应的规格文档已正式发布。
2. 2.1 版本承诺向后兼容,破坏性变更将集中在 2.2 版本推出。
3. 无需强制升级,可根据自身场景需求评估;2.0 版本仍会持续维护。
压缩与随机访问性
能兼得
近期有一篇论文针对随机访问性能展开评测,其结论明确指出:
Lance 是当前速度最快的格式,原因在于它无需像其他格式那样采用级联编码或压缩机制。这一特性使得整数等特定数据类型可直接计算偏移量,最大限度降低了读放大问题。
在 2.0 版本时期,“缺乏压缩能力” 是一大明显局限。因此,2.1 版本的核心目标便是:在不损失随机访问性能的前提下,引入级联编码与压缩功能。
我们曾在“结构化编码深度解析”一文中,详细介绍过支撑该特性的编码策略;相关研究论文中也对此进行了更深入的分析。
如今我们可以正式告知:这一目标已成功实现,随机访问性能未受任何影响。从目前来看,Lance 依旧保持着速度领先优势。
“结构化编码深度解析”文章链接:https://lancedb.com/blog/columnar-file-readers-in-depth-structural-encoding/
一、其他新增优势
除压缩带来的益处外,2.1 版本还包含多项细节优化:
1. 读取嵌套数据(如 lists、structs 类型)时,所需的 IOPS(每秒输入 / 输出操作)显著减少。
2. 支持区分 “空 struct” 与 “空值” 两种不同数据状态。
3. 新增可选的 “重复索引缓存(repetition index caching)” 功能 —— 以占用更多内存为代价,进一步降低可变宽度数据的 IOPS 消耗。
如何升级至 2.1 版本
数据存储版本以 “数据集” 为单位进行设置。
若你对 2.0 版本的性能满意,完全无需强制升级,我们会继续维护 2.0 版本;若需使用 2.1 版本的新特性,则需复制一份现有数据集。最简单的实现方式如下(以 Python 代码为例):
import lanceds = lance.dataset("my_2_0_dataset")lance.write_dataset(ds, "my_2_1_dataset", data_storage_version="2.1")
是否需要升级
对部分场景而言,升级 2.1 版本的收益并不显著。
例如,向量嵌入、图像、音频等数据通常已预先完成压缩,且这类数据往往占据数据集的大部分存储空间 —— 即便升级,整体压缩收益也十分有限。
不过,对较小列的压缩仍能加快其扫描速度;但如果你的场景已充分利用二级索引、无需依赖全列扫描,那么升级带来的提升可能并不明显。
相反,以下场景更有可能从升级中受益:以扫描 “小列” 为主、且受磁盘带宽限制的场景 —— 这类负载的性能瓶颈通常在于磁盘带宽。建议你先转换部分数据进行测试,评估数据集体积是否有明显缩减,或性能是否有实质提升。
💡 最可能受益的场景:
1. 以扫描小列为主、受磁盘带宽限制的负载。
2. 对列扫描性能敏感的分析场景。
💡 受益有限的场景:
1. 向量嵌入、图像、音频占比较高(这些数据通常已预压缩)。
2. 主要依赖二级索引、并不频繁进行全列扫描的查询路径。
平滑升级的注意事项
Lance 0.38.0 版本是首个对 2.1 文件格式提供完整读取支持的版本。
若你在写入 2.1 格式文件时使用较新版本的 Lance,而读取时却使用旧版本,可能会出现兼容性问题。
💡 升级建议:
1. 在开始写入 2.1 格式文件前,请将所有相关软件升级至 0.38.0 版本或更高版本。
2. 为方便过渡,0.38.0 版本的默认文件格式仍为 2.0,需手动显式开启才能写入 2.1 格式。
在 0.38.0 版本中,写入 2.1 格式需显式指定,代码示例如下:
# 在 0.38.0 中,写入 2.1 需要显式选择lance.write_dataset(data, "my_2_1_dataset", data_storage_version="2.1")
我们计划在近期(可能是下一个版本)调整默认设置,将 2.1 设为默认格式。
若你计划在一段时间内同时使用新旧版本的 Lance,建议在新建数据集时明确指定为 2.0 格式,代码示例如下:
# 如果你计划在一段时间内保留旧版与新版混用# 请在新建数据集时显式设置数据存储版本为 2.0lance.write_dataset(data, "my_2_0_dataset", data_storage_version="2.0")
需特别说明:上述注意事项仅针对 “新建数据集”。向现有数据集追加或更新数据时,系统会自动沿用该数据集原有的数据存储版本,无需额外设置。
未来规划:2.2 版本方向
目前我们已启动 2.2 版本的研发工作,最终功能尚未完全确定,但以下是我们正在探索的核心方向:
一、简化版本迁移流程
我们计划让 2.1 成为 “最后一个需通过复制数据集实现升级” 的版本。2.1 版本已为文件读取器确立了统一的整体结构 —— 未来新增任何编码方式,都能在该结构下保持兼容。
因此,2.2 版本将支持 “混合版本数据集”,无需复制即可完成升级。
混合版本数据集:https://github.com/lancedb/lance/issues/4870
二、补充压缩能力空白
2.1 版本的目标是确立整体压缩策略,并定义易于实现的压缩算法特性(traits)。目前我们已实现多种主流轻量级压缩技术,但仍存在部分压缩场景未覆盖。
2.2 版本将重点补齐这些空白。若你熟悉列式压缩技术并希望贡献代码,可关注 2.2 版本里程碑中带有 “good_first_issue” 标签的议题,这些议题非常适合新手参与。
Lance File Version 2.2:https://github.com/lancedb/lance/milestone/9
三、完善结构体打包功能
当前版本已支持对 “定长字段” 的结构体打包,但由于缺乏对 “变长字段” 的支持,该特性的价值未能充分发挥。
我们计划在 2.2 版本中新增变长字段支持,让用户能在 “行式存储” 与 “列式存储” 之间灵活权衡。
这一优化对云存储上的模型训练等场景尤为重要 —— 此类场景的性能往往受限于对 “较小物化子集” 的随机读取效率。
四、优化 JSON 编码方式
在表格格式中,我们已通过新增 JSON 索引持续增强 JSON 数据支持。
与此同时,我们也在探索文件格式中存储 JSON 数据的最优方案,例如参考 JSONB、Parquet Variant 等主流数据类型的设计思路。后续会公布更多相关细节。
2.2 方向一览:
1. 支持混合版本数据集,彻底消除 “升级需复制数据集” 的繁琐操作。
2. 补齐压缩能力空白,欢迎开发者通过 “good_first_issue” 议题参与贡献。
3. 新增变长字段的结构体打包支持,优化云端模型训练场景的读取性能。
4. 探索更高效、可扩展的 JSON 编码与存储方案。
共同交流
欢迎通过我们的 Discord 社区或 GitHub 仓库参与讨论。若你需要更多技术细节,或能为功能实现提供更好的思路,欢迎随时提出建议;若遇到功能异常或性能问题,也请及时反馈给我们。
推荐阅读

点击阅读原文,跳转LanceDB GitHub



