ModaHub AI模型开源社区——向量数据库Milvus存储操作教程

目录

存储操作

数据插入

数据落盘

定时触发

客户端触发

缓冲区达到上限触发

数据合并

建立索引

删除

删除集合

删除分区

删除实体

数据段整理

数据读取

常见问题


存储操作

阅读本文前,请先阅读 存储相关概念。

数据插入

客户端通过调用 insert 接口来插入数据,单次插入的数据量不能大于 256 MB。插入数据的流程如下:

  1. 服务端接收到插入请求后,将数据写入预写日志(WAL)。
  2. 当预写日志成功记录后,返回插入操作。
  3. 将数据写入可写缓冲区(mutable buffer)。

每个集合都有独立的可写缓冲区。每个可写缓冲区的容量上限是 128 MB。所有集合的可写缓冲区总容量上限由系统参数 insert_buffer_size 决定,默认是 1 GB。

数据落盘

缓冲区中的数据落盘有三种触发机制:

定时触发

系统会定时触发落盘任务。定时间隔由系统参数 auto_flush_interval 决定,默认是 1 秒。

落盘操作的流程如下:

  1. 系统开辟一块新的可写缓冲区,用于容纳后续插入的数据。
  2. 系统将之前的可写缓冲区设为只读(immutable buffer)。
  3. 系统把只读缓冲区的数据写入磁盘,并将新数据段的描述信息写入元数据后端服务。

完成以上流程后,系统就成功创建了一个数据段(segment)。

客户端触发

由客户端调用 flush 接口触发落盘。

缓冲区达到上限触发

累积数据达到可写缓冲区的上限(128MB)会触发落盘操作。

每个数据段的所有相关文件都被存放在以段 ID 命名的文件夹中,比如记录实体 ID 的 UID 文件、用于标记已被删除实体的 delete_docs 文件,以及用于快速查找实体的布隆过滤器(bloom-filter)文件。

段内数据文件请参考 分区和数据段 中的示意图。

 

数据合并

小数据段过多会导致查询性能低下。为了避免此问题,Milvus 会在需要的时候触发后台段合并任务,即把小数据段合并成新的数据段,并删除小数据段、更新元数据。其中,新数据段的大小不低于 index_file_size。

合并操作的触发时机如下:

  • 启动服务时
  • 完成落盘任务后
  • 建索引前
  • 删除索引后

已经建立了索引的数据段不会参与合并操作。

建立索引

未建立索引之前,Milvus 对集合的查询操作都是以暴力搜索(brute-force search)的方式完成的。为提高查询性能,你可以为集合建立合适的索引。索引建成后,每个数据段都会产生一个索引文件,此时元数据也会同步更新。

更多索引相关信息,请参考 向量索引。

删除

删除集合

  1. 客户端调用 drop_collection 接口来删除一个集合。
  2. 服务端接收到请求后,仅在元数据中把该集合(包括它的分区和段)标记为删除状态。对于已标记为删除状态的集合,将无法再对其进行任何新操作(比如插入和查询)。
  3. 后台的清理任务将被标记为删除状态的集合(包括它的分区和段)从元数据中删除,然后将该集合的数据文件和文件夹从磁盘上删除。如果在删除操作之前已经有对该集合的操作正在执行,后台清理任务不会删除正在使用的段,直到操作完成。

删除分区

  1. 客户端调用 drop_partition 接口来删除一个分区。
  2. 服务端接收到请求后,仅在元数据中把该分区(包括它的段)标记为删除状态。
  3. 后台清理任务按照删除集合的流程来删除该分区和元数据。

删除实体

Milvus 为每个数据段建立了一个 delete_docs 文件,用来记录被删除向量在段内的位置。

Milvus 使用布隆过滤器(bloom filter)来快速判断一个实体 ID 是否可能存在于某个数据段中。因此,在每个数据段下都创建了一个名为 bloom_filter 的文件。

删除实体的流程如下:

  1. 客户端调用 delete_entity_by_id 接口删除集合中的实体。
  2. 服务端接收到请求后,执行以下操作删除实体:
    • 如果该实体在插入缓冲区中,直接删除该实体。
    • 否则,根据每个数据段的布隆过滤器判断该实体所处的数据段,然后更新该数据段的 delete_docs 以及 bloom_filter 文件。

 

数据段整理

查询一个数据段时,Milvus 会将该数据段的实体数据以及 delete_docs 文件读入内存。虽然被删除的实体不参与计算,但它们也会被读入内存。所以,一个数据段中被删除的实体越多,浪费的内存资源和磁盘空间越多。为了减少此类不必要的资源消耗,Milvus 提供了数据段整理(compact)的操作,流程如下:

  1. 客户端调用 compact 接口。
  2. 服务端接收到请求后,根据 delete_docs 所记录的信息,将段内未被删除的实体写入一个新的数据段,并把旧数据段标记为删除状态。之后将由后台清理任务负责清理被标记为删除状态的数据段。如果旧数据段已建立索引,新数据段产生之后会重建索引。

compact 操作会忽略被删除向量占比小于 10% 的数据段。

数据读取

  1. 客户端调用 get_entity_by_id 接口读取原始实体数据。
  2. 服务端接收到请求后,通过布隆过滤器找到实体所在的段,返回该实体 ID 对应的数据。

浮点型向量在 Milvus 中以单精度(float)方式存储。

 

常见问题


Milvus 可以通过扩展某些接口(如 S3 接口、GlusterFS 接口)来扩展存储吗?

目前暂不支持。

Milvus 有没有数据导出的功能?

目前没有专门的工具实现该功能。你可以通过 get_entity_by_id 得到指定 ID 对应的向量。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/5464.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多通道分离与合并

1、分离 2、合并 Mat img imread("F:/testMap/plan.png");Mat imgs[3];split(img,imgs);//分离Mat img0,img1,img2;img0 imgs[0];img1 imgs[1]; img2 imgs[2];Mat img_H;merge(imgs,3,img_H);//合并vector<Mat> imgsV; imgsV.push_back(img0);imgsV.push_b…

git常用命令之分支操作

3. 分支 3.1 创建分支 场景1&#xff1a;创建新分支 工作中遇到的使用方式&#xff1a;1.拉取新分支&#xff0c;2.做新需求 /修复BUG &#xff0c;3.基于新分支提PR到目标分支 命令作用延展阅读git branch test11. 基于当前分支最新提交新建分支 test1(但不会切换到test1分…

Bootstrap 按钮

文章目录 Bootstrap 按钮按钮大小按钮状态激活状态禁用状态 按钮标签 Bootstrap 按钮 本章将通过实例讲解如何使用 Bootstrap 按钮。任何带有 class .btn 的元素都会继承圆角灰色按钮的默认外观。但是 Bootstrap 提供了一些选项来定义按钮的样式&#xff0c;具体如下表所示&…

Redis - Redis GEO实现经纬度测算距离,附近搜索范围

Redis GEO 主要用于存储地理位置信息&#xff0c;并对存储的信息进行操作&#xff0c;该功能在 Redis 3.2 版本新增 一、Redis GEO 操作方法 geoadd&#xff1a;添加地理位置的坐标 geopos&#xff1a;获取地理位置的坐标 geodist&#xff1a;计算两个位置之间的距离 geor…

【ArcGIS Pro二次开发】(43):线闭合

当我们需要将多段线【polyline】转为面【polygon】的时候&#xff0c;必须保证线是闭合的&#xff0c;不然是无法生成面的&#xff0c;如下图&#xff1a; 如果cad线段&#xff0c;可以在属性里将闭合选项设置为是&#xff0c;实现线的闭合&#xff1a; 但如果是在ArcGIS Pro里…

C++【初识哈希】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 16.11.17 文章目录 &#x1f307;前言&#x1f3d9;️正文1、哈希思想2、哈希函数2.1、哈希函数的设计原则2.2、常见的哈希函数 3、哈希…

云原生——什么是云原生?

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 前言 伴随云计算的滚滚浪潮&#xff0c;云原生(CloudNative…

kubernetes核心概念 controller

kubernetes核心概念 Controller 一、pod控制器controller 1.1 Controller作用及分类 controller用于控制pod 参考: https://kubernetes.io/zh/docs/concepts/workloads/controllers/ 控制器主要分为: Deployments 部署无状态应用&#xff0c;控制pod升级,回退ReplicaSet 副…

ROS自带OpenCV和本地OpenCV版本冲突问题解决

1、报错信息 首先catkin_make编译功能包没有任何问题&#xff0c;100%生成目标文件&#xff0c;但是报了警告&#xff1a;库文件libmyslam.so需要的是libopencv_core.so.3.4&#xff0c;可能会与libopencv_core.so.3.2冲突。根据工程经验&#xff0c;警告不用管&#xff0c;直…

从浏览器输入url到页面加载(六)前端必须了解的路由器和光纤小知识

前言 上一章我们说到了数据包在网线中的故事&#xff0c;说到了双绞线&#xff0c;还说到了麻花。这一章继续沿着这条线路往下走&#xff0c;说一些和cdn以及路由器相关&#xff0c;运营商以及光纤相关的小知识&#xff0c;前端同学应该了解一下的 目录 前言 1. CDN和路由器…

Vue中watch与computed区别

<body><div id"root">姓&#xff1a;<input type"text" v-model"firstName"><br/><br/>名&#xff1a;<input type"text" v-model"lastName"><br/><br/>全名&#xff1a;&…

Spring:Bean

Bean 概述配置方式自动装配继承与依赖作用域外部属性文件的使用 概述 Spring 容器负责管理依赖注入&#xff0c;它将被管理的对象都称为 bean 。我们通过 xml 文件配置方式进行对 bean 的声明和管理。 写法如下&#xff1a; <beans><bean id"bean的唯一标识符…