大数跨境
0
0

Lance 文件格式 2.1 正式发布稳定版

Lance 文件格式 2.1 正式发布稳定版 Lance & LanceDB
2025-10-29
0

图片


本文翻译自 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 

【声明】内容源于网络
0
0
Lance & LanceDB
欢迎关注 Lance & LanceDB 技术公众号!Lance 是开源多模态数据湖格式,支持快速访问与高效存储。基于其构建的 LanceDB 是无服务器向量数据库。我们聚焦技术解读、实战案例,助你掌握 AI 数据湖前沿技术。
内容 19
粉丝 0
Lance & LanceDB 欢迎关注 Lance & LanceDB 技术公众号!Lance 是开源多模态数据湖格式,支持快速访问与高效存储。基于其构建的 LanceDB 是无服务器向量数据库。我们聚焦技术解读、实战案例,助你掌握 AI 数据湖前沿技术。
总阅读5
粉丝0
内容19