因参与的项目需要,需要事先调研lance及lanceDB数据库,此处以作记录。

lance相关库及本次调研相关参考材料如下:https://github.com/lancedb/lance
https://blog.lancedb.com/lance-v2/

一、lance数据

新数据的诞生源于多方面因素,其中最重要的因素为现有的列式格式数据对于AI/ML工作负载的处理效率不同。

由于该领域存在一些本人尚未涉足的领域,因此在此处将博客中提及的所需前置背景知识及促使lance数据格式产生的挑战均放置于此。

(一)相关背景知识

1.列式数据

列式数据

2.point lookups(点查询)

point lookups点查询是一种访问少量行的查询,无论何时使用二级索引,点查询都是必不可少的,例如,语义检索和全文检索在lanceDB中都会以点查询的形式存在。传统的Parquet在点查询方面的主要挑战在于它的编码是不可切片的,这会导致即使我们需要通过加载整个数据页才能够访问单行,对于多模态相关工作而言,它们的数据往往值很大,这一弊端将会极大地影响查询与合并的过程。
parquet挑战

3.wide columns(宽列)

宽列是指每列的值都非常大的列。传统的数据库通常使用较小的列(例如float,double等),即使strings被当成是比较大的列,实际应用中也是非常小的,在机器学习的过程中,我们可能需要存储语义搜索embeddings这样的张量,甚至是图像。因此当文件具有宽列时,选择合适的行组十分困难。
宽列导致的问题
行组指的是在列式存储里,数据是按列存储的,但物理文件通常会被切分成多个块,每个块就是一个 row group。
一个 row group 包含一批行的所有列数据,只是这些列数据是分开按列存放的。


举例:行组演示

4.very wide schemas(非常宽的架构)

有些时候,在某些任务中,用户的workloads中存在着很多列,例如在特征存储的过程中可能存在着非常多维度的特征。Parquet和其他的列式结构通过强大的列投影来帮助我们,即便是列式存储(能投影出所需列),也必须先读取整个 schema 元数据(所有列的定义),这对低延迟场景来说代价很高。且如果缓存多个文件的 schema 元数据,会占用大量内存。
非常宽架构上的问题

5.flexible metadata灵活的元数据

由于在Parquet中,encoding只能控制数据页中包含的内容,这意味着编码无法访问列或文件元数据。
元数据不灵活性导致的问题
parquet存储方式

在例如考虑字段编码时,由于字典编码在整个列中是恒定的,因此我们希望将字典放入列元数据中,但是parquet却必须放在数据页中,造成冗余,举例如下。
parquet元数据缺点举例

(二)lance数据格式特点

在构建lace过程中,开发者考虑了更多的用例,例如非表格数据,一次写一个数组,可配置且更灵活的对齐方式,通过将视频视为“块”来写入极大的单元。

encoding依靠插件

以前的列式数据存储形式parquet将“如何压缩/编码数据”写死在格式中,lance当中每个列的数据如何压缩编码均由外界插件决定,仅在文件内部放置“说明书”告知读者数据使用何种编码,指导读者寻找对应插件解码,如此具备高度灵活性,算法可以随时添加而不需要修改数据格式。

没有类型系统

在lance v2中,所有列都是一堆页(page)+一堆buffer,不在意数据究竟是int或是string。真正要转换成带类型的数组时以来上层进行。

没有row group

parquet的row group把多行数据捆绑导致调参困难,过小浪费元数据,过大对内存要求与并发io要求高。lance v2取消这一概念,岭每一列独立进行。

写:每个列攒够 8 MiB 就写一页,内存占用低。
读:一次只读需要的列页,I/O 和计算线程分开跑,CPU 解码时可以同时预取下一批数据。
并发:需要多进程并行?与其在一个文件里分 10 个 Row Group,不如直接生成 10 个文件,管理更简单。

列长短可不一,投影快

列与列之间无耦合,字典,统计信息等可以在写代码的时候自由决定放置位置。

统计信息也是编码的一部分

parquet将min/max/null count等统计值写死在顶层格式中,而lance v2将这些处理成编码器的部分,换统计类型也不需要动格式,换/加插件即可。

总结:Lance v2 把自己定位成“只负责把列数据装进文件”的超简容器,其余(类型、编码、统计、并行策略)全部插件化。

二、lanceDB

LanceDB是一个开源的用Rust实现的向量数据库,主要特点如下:

1-提供单机服务,可以直接嵌入到应用程序中;
2-支持多种向量索引算法,包括Flat、HNSW、IVF等;
3-支持全文检索,包括BM25、TF-IDF等;
4-支持多种向量相似度算法,包括Cosine、L2等;5-与arrow生态系统紧密集成,允许通过simd与gpu加速在共享内存中实现真正的0拷贝访问。

一句话总结:lanceDB是一个面向AI时代的开源多模态向量数据库,把图片、视频、文本、向量等 AI 数据一次性存进去,就能以毫秒级延迟做向量搜索、过滤、SQL 查询,并且不需要额外跑数据库服务。