news 2026/7/14 18:17:35

嵌入式向量数据库:Zvec、ObjectBox、SQLite-Vector、SatoriDB

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式向量数据库:Zvec、ObjectBox、SQLite-Vector、SatoriDB

概述

偶然间看到嵌入式向量数据库,秃然对这个主题产生兴趣,于是产出此文。

说到嵌入式数据库,不严谨地说,大抵有两种形式,要么内存,要么文件。一般而言,几乎所有嵌入数据库,都支持这两种形式。因为内存易失性,所以需要文件作为持久化存储备份;也因为文件读写速度慢,所以需要内存提供性能。

对嵌入式关系型数据库感兴趣可移步内存数据库Apache Derby、H2。

Zvec

官网,阿里开源(GitHub,14.8K Star,924 Fork)类SQLite的轻量级嵌入式向量数据库,专为终端侧设计,具备开箱即用、资源可配置、极致性能以及多样化向量能力四大核心优势。旨在为开发者提供从原型验证到端侧生产部署的一站式解决方案。官方文档。

设计宗旨:

  • 嵌入式:纯本地运行,无需网络或独立服务,零配置迅速启动;运行时资源(如内存)可控,接口设计简洁,并易于集成和扩展,可无缝嵌入终端应用、CLI工具、AI框架或数据库系统;
  • 向量原生:全栈面向向量工作负载设计,提供丰富的高质量索引与量化能力,满足不同资源约束下的需求,并深度适配各类硬件平台;支持丰富的向量检索模式,覆盖RAG、多模态搜索等应用需求;
  • 生产就绪:以稳定性为核心,通过持久化存储、线程安全访问与崩溃自动恢复等机制,确保在手机、CLI、车载等无运维终端环境中长期可靠运行,避免因异常退出导致数据丢失或状态不一致。

能力总览

类别能力支持详情
SDK/平台支持PythonSDK3.10~3.12
操作系统Linux、MacOS
数据操作CRUD操作Insert,Update,Upsert,Delete,DeleteByFilter,Fetch
查询方式单向量、多向量融合、条件过滤、标量-向量混合查询、RNN/暴力检索/调整索引检索参数
Schema变更列操作支持Column的ADD/DROP/ALTER
索引操作支持Index的CREATE/DROP
持久化崩溃恢复WAL+Checkpoint,溃后数据零丢失
场景扩展RAG扩展提供Embedding/Rerank等能力并支持扩展
向量/量化类型DenseFP32,FP16,INT8
SparseSPARSE_FP32,SPARSE_FP16
量化FP16,INT8,INT4(支持Refine/ScaleFactor精度补偿)
索引算法FLATDense/Sparse
HNSWDense/Sparse
IVF仅支持Dense
数据类型标量类型STR,BOOL,INT32/64,UINT32/64,FLOAT,DOUBLE,ARRAY
过滤条件参考Filter支持
资源控制内存控制分块写入+mmap+内存强管控
并发控制索引构建+全局查询并发

极致性能:满足端侧实时交互需求

基于阿里巴巴通义实验室自研的高性能向量引擎Proxima,通过深度优化,包括多线程并发,内存布局优化,SIMD加速,CPU预取等技术优化策略,显著提高索引构建与查询流程的计算效率,实现低延迟、高吞吐的向量检索能力,端侧资源受限场景下也能做到实时交互。

在VectorDBBench的典型场景(Cohere 10M数据集)中,在相当硬件配置以及对齐Recall水平的前提下,检索吞吐超过8k QPS,是此前榜单首位(ZillizCloud)的2倍以上,同时构建延迟大幅缩短,展现出全面领先的性能优势。

官方Benchmark性能测试。

资源可控:适配CLI、移动端等资源受限环境

在移动端、Serverless函数或CLI工具等资源受限环境中,向量系统必须对内存与CPU使用具备明确边界,否则极易因资源超限导致应用崩溃或系统干预(如Linux OOM Killer或Android ANR)。从架构层面内置资源约束机制,确保在有限资源下稳定运行。

内存控制:向量索引适配有限内存,避免OOM

HNSW等图索引在构建或查询阶段可能瞬时占用数倍于原始数据的内存。为避免此类不可控行为,提供三层内存管理机制:

  1. 流式分块写入:写入默认采用64MB分块流式处理,避免全量数据驻留内存,兼顾写入效率和内存占用;
  2. mmap按需加载:支持通过enable_mmap=true启用内存映射模式。在此模式下,向量与索引数据由操作系统按需换入物理内存,即使总数据量超过可用RAM,亦可避免OOM;
  3. 强内存管控:实验性功能,当未启用mmap时,进入强内存管控管控模式,Zvec会维护一个隔离的、进程级的内存池,可通过memory_limit_mb参数显式限定该内存池的预算上限。

并发控制:避免线程资源侵占,保障主线程响应性

在GUI应用中,无约束的向量计算可能启动大量线程,耗尽CPU资源,导致UI卡顿或调度器惩罚。提供细粒度并发调控能力:

  1. 索引构建并发控制:所有索引创建接口均支持concurrency参数,用于指定构建阶段的并行线程数;可通过全局optimize_threads参数限制进程内最大构建并发,防止后台任务抢占前台资源;
  2. 查询并发控制:通过query_threads全局参数,可限定查询阶段的最大并发线程数。

应用就绪:RAG场景下能力全覆盖

  • 动态知识库管理
    1. 提供完整CRUD能力,允许用户实时更新私有知识,满足知识动态更新需求;
    2. 支持Schema变更,便于根据元数据演进或查询模式动态选择最优索引策略。
  • 多路召回与融合
    1. 原生支持多向量联合查询,轻松实现多路语义以及语义+关键词召回;
    2. 内置默认重排序器(支持加权融合与RRF等策略),自动完成多路结果融合与排序,无需应用层手动合并。
  • 标量-向量混合查询
    1. 支持标量过滤条件下推至向量索引执行层,避免高维空间中的全量扫描,显著提升混合查询效率;
    2. 标量字段可选建倒排索引,加速等值/范围过滤,进一步优化混合检索性能。

聚焦四个方向持续迭代:

  • 开发体验优化:完善CLI工具和多语言SDK、LangChain集成,面向典型场景完善扩展;
  • 能力纵向扩展:持续增强索引能力,打造分组查询等向量特色能力,并持续跟进主流性能榜单;
  • 生态协同共建:推进DuckDB、PG向量扩展集成、外表(Parquet/CSV)支持,参与生态共建;
  • 场景闭环验证:与ISV、硬件厂商合作,打磨端侧真实交付案例。

对比

类别能力ZvecFaissDuckDB(vss)Milvus(Lite)LanceDBPG Vector
部署形态嵌入式
单机(服务化)
分布式
资源控制内存
线程
向量索引(HNSWonly)(FLAT/IVF_FLATonly)
向量能力稠密向量(FP32only)
稀疏向量
量化
混合检索(向量+标量)
数据操作多向量检索
完整的CRUD
可靠性崩溃恢复

注:仅供参考,不一定完全正确。

实战

安装:pip install zvec

SDK集成:

importzvec schema=zvec.CollectionSchema(name="demo",vectors=zvec.VectorSchema("embedding",zvec.DataType.VECTOR_FP32,4),)collection=zvec.create_and_open(path="./zvec_example",schema=schema,)collection.insert([zvec.Doc(id="doc_1",vectors={"embedding":[0.1,0.2,0.3,0.4]}),zvec.Doc(id="doc_2",vectors={"embedding":[0.2,0.3,0.4,0.1]}),])results=collection.query(zvec.VectorQuery("embedding",vector=[0.4,0.3,0.3,0.1]),topk=10)print(results)

ObjectBox

官网,基于JVM的开源(GitHub,4.6K Star,307 Fork)跨平台(包括Android和iOS)高性能设备端向量数据库,专为移动设备、物联网和其他受限硬件设计。提供简单易用的API,使开发人员能够快速存储和检索数据。与SQLite相比,ObjectBox的速度快10倍。

优势:

  • 高性能:快速存储和检索数据
  • 易于使用:提供简单易用的API
  • 数据同步:支持在多个设备之间同步数据
  • 数据安全:提供数据加密和身份验证功能

核心架构

  • Engine层(魔法引擎):用C++实现的高性能存储引擎,直接操作二进制文件,比SQLite快10倍
  • Core层(魔法指挥中心):Java/Kotlin API层,负责管理事务、生成代码、与Engine通信
  • Extensions层(魔法扩展包):支持RxJava、LiveData等扩展功能

编译时自动生成MyObjectBoxUser_等类,避免运行时反射,提升性能。

数据以B-Tree结构存储在.db文件中,通过多级分叉快速定位数据。

每个操作默认在事务中执行,保证原子性。

实战

对于Gradle项目,添加依赖:

implementation'io.objectbox:objectbox-android:latest.version'annotationProcessor'io.objectbox:objectbox-processor:latest.version'

实体类定义

@EntitypublicclassStudent{@Idprivatelongid;@IndexprivateStringname;@TransientprivateinttempUsageCount;// 用于表字段与代码字段不一致场景@NameInDb("USERNAME")privateStringname;// 一对一关联privateToOne<Class>classToOne;privateintage;}

若新建或修改实体,都需要重新Make Project来生成新的实体操作对象。

其他注解:

  • @Backlink:表示反向关联
  • @UID

数据操作:

Box<Student>stuBox=BaseApp.getInstence().getBoxStore().boxFor(Student.class);Studentstudent=newStudent();student.name="Jay";stuBox.put(student);StudentjayStudent=stuBox.query().equal(Student_.name,"Jay").build().find();stuBox.remove(student);

SQLite-Vector

官网,SQLite官方推出的开源(GitHub,1K Star,43 Fork)嵌入式向量数据库。

特性:

  • 无需虚拟表:直接将向量作为BLOB存储在普通表中
  • 极速:经过优化的C实现,支持SIMD加速
  • 支持TurboQuant:使用qtype=TURBO进行SIMD 2/3/4位量化扫描
  • 低内存占用:默认仅需30MB RAM
  • 无需预建索引:无需漫长的预处理或索引构建阶段
  • 离线可用:非常适合端侧、隐私保护的AI工作负载
  • 即插即用:以最小工作量集成到现有SQLite工作流中
  • 跨平台:开箱即用,支持所有主流操作系统

实战

-- 常规建表CREATETABLEimages(idINTEGERPRIMARYKEY,embeddingBLOB,-- store Float32/UInt8/etc.labelTEXT);-- Insert a BLOB vector (Float32, 384 dimensions) using bindingsINSERTINTOimages(embedding,label)VALUES(?,'cat');-- Insert a JSON vector (Float32, 384 dimensions)INSERTINTOimages(embedding,label)VALUES(vector_as_f32('[0.3, 1.0, 0.9, 3.2, 1.4,...]'),'dog');-- Initialize the vector. By default, the distance function is L2.-- To use a different metric, specify one of the following options:-- distance=L1, distance=COSINE, distance=DOT, distance=SQUARED_L2, or distance=HAMMING.SELECTvector_init('images','embedding','type=FLOAT32,dimension=384');-- Quantize vectorSELECTvector_quantize('images','embedding');-- Or use TurboQuant for compact 2/3/4-bit quantizationSELECTvector_quantize('images','embedding','qtype=TURBO,qbits=4');-- Optional preload quantized version in memory (for a 4x/5x speedup)SELECTvector_quantize_preload('images','embedding');-- Run a nearest neighbor query on the quantized version (returns top 20 closest vectors)SELECTe.id,v.distanceFROMimagesASeJOINvector_quantize_scan('images','embedding',?,20)ASvONe.id=v.rowid;-- Streaming mode: omit k to get rows progressively, use SQL to filter and limitSELECTe.id,v.distanceFROMimagesASeJOINvector_quantize_scan('images','embedding',?)ASvONe.id=v.rowidWHEREe.label='cat'LIMIT10;

Python SDK安装:pip install sqliteai-vector

Python示例:

SatoriDB

官网,基于Rust,轻量、嵌入式、高性能的开源(GitHub,242 Star,19 Fork)向量数据库,支持十亿级向量数据集的近似最近邻(ANN)搜索,能在普通服务器上实现95%+召回率与可预测延迟。

目前主流向量数据库大多是C-S架构,需单独部署服务进程,通过gRPC/HTTP通信。很适合大规模生产环境,不足之处:

  1. 部署复杂,需管理额外服务、网络配置、认证授权等;
  2. 资源开销大:常驻内存占用高,不适合低配机器,处理不当容易直接卡死;
  3. 延迟不可控:网络往返增加查询延迟;
  4. 离线场景不适用:无法用于无网络环境(如车载、工控设备)、以及私人部署。

类似于SQLite,以库的形式直接链接到程序中,实现零外部依赖、零运维成本、零网络开销。启动即用,关闭即停,数据持久化在本地磁盘。

适用场景:边缘设备、桌面应用、单机原型或资源受限环境。

架构

灵感部分源自论文SPFresh,不追求将全部向量塞进内存,而是通过智能路由,仅加载必要部分,实现按需加载。

第一层:热索引——内存中的导航图

巧妙的将整个向量空间划分为若干桶(Buckets),每个桶由一组相似向量组成。系统对每个桶计算一个质心(Centroid),并将所有质心再构建为一个HNSW图。

关键优化点在于:质心被标量量化(Scalar Quantization)。将32位浮点数(f32)的质心坐标,压缩为8位无符号整数(u8)。使HNSW索引直接体积缩小至原来的1/4,从而实现数十万甚至上百万个桶的路由索引轻松驻留内存。

接收到查询请求时,系统在HNSW上快速找到与查询向量最接近的Top-K个桶(通常K=10~100),只有这些桶会被后续扫描,而非全量数据。

第二层:冷存储(Cold Tier)——磁盘上的向量仓库

那些被查找到的的桶,其原始向量数据存储在磁盘上的。使用两个底层引擎协同工作:

  1. Walrus:基于io_uring的高性能追加日志存储,按桶组织topic,支持高吞吐写入;
  2. RocksDB:用于元数据索引,支持按ID快速查找、去重等操作。

在查询阶段,系统会启动多个CPU-pinned Glommio工作线程(每个绑定到特定CPU核心),并行读取选中的桶数据。确保每个worker拥有独立的:io_uring异步I/O环、LRU缓存(每个worker默认缓存64个桶,最多64MB)、预分配堆内存。

这种无共享(Shared-Nothing)的设计模式彻底避免跨核同步产生的开销,极大提升并发效率。

性能加速:SIMD+io_uring+自动调优

在计算密集型操作上全面启用SIMD指令集(AVX2/AVX-512):向量距离计算(L2、点积);标量反量化(u8→f32);K-Means聚类分配。

在AVX-512支持的CPU上,单核每秒可完成数百万次距离计算。

此外,系统具备很强的自适应能力:

  • 自动聚类:实现新向量插入后,通过K-Means分配到最近桶;
  • 自动分裂:当桶内向量数超过阈值(默认2000),后台rebalancer会自动将其分裂为两个新桶,确保查询负载均衡;
  • HNSW重建:每插入一定数量向量(默认1000),热索引会增量重建,保持搜索精度。

这些机制共同保障即使在十亿级数据下,查询延迟依然稳定可预测。

实战

API设计极其简单,支持同步、异步两种模式:

usesatoridb::SatoriDb;fnmain()->anyhow::Result<()>{letdb=SatoriDb::builder("my_app").workers(4)// 工作线程数.fsync_ms(100)// 持久化间隔.data_dir("/tmp/mydb").build()?;db.insert(1,vec![0.1,0.2,0.3])?;db.insert(2,vec![0.2,0.3,0.4])?;db.insert(3,vec![0.9,0.8,0.7])?;letresults=db.query(vec![0.15,0.25,0.35],10)?;for(id,distance)inresults{println!("id={} distance={}",id,distance);}Ok(())}// 自动 shutdown

官方还提供BigANN十亿级数据集的基准测试脚本,在普通NVMe SSD服务器上,能在数小时内完成十亿向量导入,并在毫秒级返回Top-10结果,召回率超95%。

参考

  • Zvec:开箱即用、高性能的嵌入式向量数据库
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 18:14:19

点云深度学习系列博客(八): 面向自动驾驶场景的点云数据增强实战

1. 自动驾驶场景下的点云数据增强挑战激光雷达点云在自动驾驶系统中扮演着关键角色&#xff0c;但原始数据往往存在稀疏性、遮挡和动态场景适应三大核心问题。我在处理KITTI数据集时发现&#xff0c;单帧点云中车辆目标的平均有效点数不足200个&#xff0c;而行人的点云密度更低…

作者头像 李华
网站建设 2026/7/14 18:11:48

基于倍福控制系统和WPF构建工控安全监控系统的完整方案

一、系统架构设计 graph LR A[WPF上位机] -->|ADS通信| B(倍福PLC) B --> C[运动控制器] B --> D[安全门传感器] B --> E[温度变送器] C --> F[伺服驱动器] D --> G[门状态反馈] E --> H[加热器]二、核心功能实现 运动控制安全逻辑 IF 急停信号=TRUE OR …

作者头像 李华
网站建设 2026/7/14 18:11:22

小白程序员必看:大模型AI应用开发5年就业市场红利与入行指南

文章分析了大模型AI应用开发赛道的长期发展逻辑&#xff0c;指出未来五年人才缺口将超300万&#xff0c;岗位增速连年翻倍&#xff0c;薪资大幅领先传统技术岗。文章区分了底层大模型研发与落地应用开发赛道&#xff0c;强调后者适合普通人入局。 预判大模型AI应用开发未来五年…

作者头像 李华
网站建设 2026/7/14 18:09:29

Astro Theme Pure插件开发教程:如何扩展主题功能

Astro Theme Pure插件开发教程&#xff1a;如何扩展主题功能 【免费下载链接】astro-theme-pure ⭐ A simple, fast and powerful blog & document theme built by Astro 项目地址: https://gitcode.com/gh_mirrors/as/astro-theme-pure Astro Theme Pure是一款简单…

作者头像 李华
网站建设 2026/7/14 18:07:38

TSB82AF15-EP时间戳偏移寄存器配置:实现1394总线精准同步

1. 项目概述与核心价值在嵌入式系统与高速串行总线设计中&#xff0c;寄存器是工程师与硬件直接对话的“控制面板”。它本质上是一块映射到特定内存地址的存储区域&#xff0c;通过读写这些地址&#xff0c;我们可以配置外设的工作模式、查询状态、甚至精细地控制每一个时钟沿的…

作者头像 李华
网站建设 2026/7/14 18:07:36

GPT-5.6来了,Plus够用还是Pro更适合?

摘要&#xff1a; GPT-5.6上线后&#xff0c;很多用户开始纠结Plus是否够用&#xff0c;还是应该升级Pro。本文围绕普通办公、内容创作、Codex编程、Deep Research和长任务场景展开&#xff0c;分析Plus和Pro分别适合哪些人。 GPT-5.6上线后&#xff0c;很多人最关心的问题不是…

作者头像 李华