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.mfbz.cn/a/33690.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机视觉】DINO

paper:Emerging Properties in Self-Supervised Vision Transformers 源码:https://github.com/facebookresearch/dino 20230627周二目前只把第一部分看完了。 论文导读:DINO -自监督视觉Transformers - deephub的文章 - 知乎 综述类型&a…

线程不安全举例

1、举例说明集合类线程不安全 &#xff08;1&#xff09;查看源码可证明 看ArrayList源码 没有sync、lock&#xff0c;线程不安全 &#xff08;2&#xff09;创建多个线程写入读取数据 List<String> list new ArrayList<>(); for (int i 1; i <30 ; i) {n…

【Android】Android虚拟机

虚拟机 Android的虚拟机主要有两种&#xff1a;Dalvik 虚拟机和 ART&#xff08;Android Runtime&#xff09;虚拟机。 Dalvik 虚拟机 Dalvik 虚拟机是 Android 早期使用的虚拟机&#xff0c;它基于寄存器架构。从Android 2.2版本开始&#xff0c;支持JIT即时编译&#xff08…

基于多站点集中汇聚需求的远程调用直播视频汇聚平台解决方案

一、行业背景 随着视频汇聚需求的不断提升&#xff0c;智慧校园、智慧园区等项目中需要将各分支机构的视频统一汇聚到总部&#xff0c;进行统一管控&#xff0c;要满足在监控内部局域网、互联网、VPN网络等TCP/IP环境下&#xff0c;为用户提供低成本、高扩展、强兼容、高性能的…

【SpringBoot】基于SSM框架的题库系统的设计与实现

文章结构 课题&#xff1a;一、项目简介主要功能技术选型 二、 模块介绍学生端教师端(一)考试管理(二)试题管理(三)学生成绩管理 管理员三、 B站项目演示地址 四、本项目其余相关博客 课题&#xff1a; 题库系统的设计与实现一、项目简介 简介&#xff1a;主要分为三个端&…

DAY38——动态规划

步骤&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 题目一. 斐波那契数列 1. 确定dp数组以及下标的含义 dp[i]的定义为&#xff1a;第i个数的斐波那契数值是dp[i] 2. 确定递推公式 状态…

【Zookeeper】win安装随笔

目录 下载地址下载目标解压后目录结构配置文件配置文件详情伪分布式安装LinuxZooKeeper audit is disabled启动解决报错&#xff1a;SLF4J: Class path contains multiple SLF4J bindings. _ 下载地址 https://zookeeper.apache.org/releases.html 下载目标 记住选择带bin的…

一步一步学OAK之四:实现如何在低延迟下使用高分辨率视频

目录 Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 创建pipelineSetup 5: 创建节点Setup 6: 设置节点的属性和参数。Setup 7: 建立链接关系Setup 8: 连接设备并启动管道Setup 9: 创建与DepthAI设备通信的输入队列和输出队列Setup 10: 主循环获取视频帧显示…

【C++】定制删除器和特殊类设计(饿汉和懒汉~)

文章目录 定制删除器一、设计一个只能在堆上(或栈上)创建的类二、单例模式 1.饿汉模式2.懒汉模式总结 定制删除器 我们在上一篇文章中讲到了智能指针&#xff0c;相信大家都会有一个问题&#xff0c;智能指针该如何辨别我们的资源是用new int开辟的还是new int[]开辟的呢&…

html5前端学习2

一篇思维题题解&#xff1a; 第五周任务 [Cloned] - Virtual Judge (vjudge.net) http://t.csdn.cn/SIHdM 快捷键&#xff1a; CtrlAltDown 向下选取 CtrlAltUp 向上选取&#xff08;会出现多个光标&#xff0c;可以同时输入&#xff09; CtrlEnter …

【Java】Java核心 78:Git 教程(1)Git 概述

文章目录 01.GIT概述目标内容小结 02.GIT相关概念目标内容小结 01.GIT概述 Git是一个分布式版本控制系统&#xff0c;常用于协同开发和版本管理的工具。它可以跟踪文件的修改、记录历史版本&#xff0c;并支持多人协同工作。通过Git&#xff0c;你可以轻松地创建和切换分支、合…

去除小程序home按钮

前言&#xff1a;当我们未登录时&#xff0c;会跳转到登录页&#xff0c;但是这时候登录页左上角会有一个跳转到首页的按钮&#xff0c;但是&#xff0c;我们不希望出现这个回到首页的按钮 去除前&#xff1a; 去除后&#xff1a; 代码&#xff1a; onShow() {wx.hideHomeBut…

从零搭建一台基于ROS的自动驾驶车-----2.运动控制

系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出 Autolabor ROS机器人教程 从零搭建一台基于ROS的自动驾驶车-----1.整体介…

VS2022 And QtCreator10 调试 Qt 源码教程

文章目录 背景IDE 调试 Qt 源码Visual Studio 2022Qt Creator 10.0.1 排查思路姊妹篇系列 简 述&#xff1a; 记录使用 Visual Studo 2022 和 QtCreator10 调试 Qt 5.15 源码和 加载 .pdb 的方法。 本文初发于 “偕臧的小站”&#xff0c;同步转载于此。 背景 源码&#xff1a;…

AR项目问题汇总

1、unity使用URP 导致ARFoundation黑屏 (16条消息) unity使用URP 导致ARFoundation黑屏_arfoundation运行iphone黑屏_weixin_46813963的博客-CSDN博客https://blog.csdn.net/weixin_46813963/article/details/117509322Configuring the AR Camera background using a Scriptab…

当RPA遇到ChatGPT, 有哪些好玩的玩法

实在RPA于2023年4月7日发布了 6.7.0 SP3&#xff0c;其中最引人注目的亮点是与ChatGPT的紧密集成 。这种集成为用户提供了全新的玩法和体验&#xff0c;使他们能够与智能模型进行即时对话和交互&#xff0c;从而提高工作效率和创造力。用户可以将ChatGPT作为虚拟助手&#xff0…

java设计模式(二十三)访问者模式

目录 定义模式结构角色职责代码实现适用场景优缺点定义 访问者模式是一种行为型模式,它允许你定义一个作用于某个对象结构中的各个元素的操作,而同时又不改变这些元素的类。该模式的核心思想是将数据结构与数据操作分离,从而可以在不改变数据结构的前提下定义新的操作。 模…

《计算机系统与网络安全》 第十章 防火墙技术

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

MySQL日志详解

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

Shell脚本编程教程

Shell脚本编程 1.Shell脚本语言的基本结构 1.1 Shell脚本的用途&#xff1a; 自动化常用命令执行系统管理和故障排除创建简单的应用程序处理文本或文件 1.2 Shell脚本基本结构&#xff1a; ​ Shell脚本编程&#xff1a;是基于过程式&#xff0c;解释执行的语言 编程语言…