从Milvus迁移DashVector
本文档演示如何从Milvus将Collection数据全量导出,并适配迁移至DashVector。方案的主要流程包括:
- 首先,升级Milvus版本,目前Milvus只有在最新版本(v.2.3.x)中支持全量导出
- 其次,将Milvus Collection的Schema信息和数据信息导出到具体的文件中
- 最后,以导出的文件作为输入来构建DashVector Collection并数据导入
下面,将详细阐述迁移方案的具体操作细节。
1. Milvus升级2.3.x版本
本文中,我们将借助Milvus的query_iterator来全量导出数据(query接口无法导出完整数据),由于该接口目前只在v2.3.x版本中支持,所以在导出数据前,需要先将Milvus版本升级到该版本。Milvus版本升级的详细操作参考Milvus用户文档。
注意:在进行Milvus Upgrade时需要注意数据的备份安全问题。
2. Milvus全量数据导出
数据的导出包含Schema以及数据记录,Schema主要用于完备地定义Collection,数据记录对应于每个Partition下的全量数据,这两部分涵盖了需要导出的全部数据。下文展示如何将单个Milvus Collection全量导出。
2.1. Schema导出
DashVector和Milvus在Schema的设计上有一些区别,DashVector向用户透出的接口非常简单,Milvus则更加详尽。从Milvus迁移DashVector时会涉及到部分Schema参数的删除(例如Collection的index_param参数),只会保留DashVector构建Collection的必要参数,以下为一个Schema转换的简单示例(其中,Collection已有的数据参考Milvus示例代码写入)。
python示例:
from pymilvus import (connections,utility,Collection,DataType
)
import os
import json
from pathlib import Pathfmt = "\n=== {:30} ===\n"print(fmt.format("start connecting to Milvus"))
host = os.environ.get('MILVUS_HOST', "localhost")
print(fmt.format(f"Milvus host: {host}"))
connections.connect("default", host=host, port="19530")metrics_map = {'COSINE': 'cosine','L2': 'euclidean','IP': 'dotproduct',
}dtype_map = {DataType.BOOL: 'bool',DataType.INT8: 'int',DataType.INT16: 'int',DataType.INT32: 'int',DataType.INT64: 'int',DataType.FLOAT: 'float',DataType.DOUBLE: 'float',DataType.STRING: 'str',DataType.VARCHAR: 'str',
}def load_collection(collection_name: str) -> Collection:has = utility.has_collection(collection_name)print(f"Does collection hello_milvus exist in Milvus: {has}")if not has:return Nonecollection = Collection(collection_name) collection.load()return collectiondef export_collection_schema(collection, file: str):schema = collection.schema.to_dict()index = collection.indexes[0].to_dict()export_schema = dict()milvus_metric_type = index['index_param']['metric_type']try:export_schema['metrics'] = metrics_map[milvus_metric_type]except:raise Exception(f"milvus metrics_type{milvus_metric_type} not supported")export_schema['fields_schema'] = {}for field in schema['fields']:if 'is_primary' in field and field['is_primary']:continueif field['name'] == index['field']:# vectorif field['type'] == DataType.FLOAT_VECTOR:export_schema['dtype'] = 'float'export_schema['dimension'] = field['params']['dim']else:raise Exception(f"milvus dtype{field['type']} not supported yet")else:try:# non-vectorexport_schema['fields_schema'][field['name']] = dtype_map[field['type']]except:raise Exception(f"milvus dtype{field['type']} not supported yet")with open(file, 'w') as file:json.dump(export_schema, file, indent=4) if __name__ == "__main__":collection_name = "YOUR_MILVUS_COLLECTION_NAME"collection = load_collection(collection_name)dump_path_str = collection_name+'.dump'dump_path = Path(dump_path_str)dump_path.mkdir(parents=True, exist_ok=True)schema_file = dump_path_str + "/schema.json"export_collection_schema(collection, schema_file)
JSON示例:
{"metrics": "euclidean","fields_schema": {"random": "float","var": "str"},"dtype": "float","dimension": 8
}
2.2. Data导出
DashVector和Milvus在设计上都有Partition的概念,所以向量以及其他数据进行导出时,需要注意按照Partition粒度进行导出。此外,DashVector的主键类型为str,而Milvus设计其为自定义类型,所以在导出时需要考虑主键类型的转换。以下为一个基于query_iterator接口导出的简单代码示例:
from pymilvus import (connections,utility,Collection,DataType
)
import os
import json
import numpy as np
from pathlib import Pathfmt = "\n=== {:30} ===\n"print(fmt.format("start connecting to Milvus"))
host = os.environ.get('MILVUS_HOST', "localhost")
print(fmt.format(f"Milvus host: {host}"))
connections.connect("default", host=host, port="19530")
pk = "pk"
vector_field_name = "vector"def load_collection(collection_name: str) -> Collection:has = utility.has_collection(collection_name)print(f"Does collection hello_milvus exist in Milvus: {has}")if not has:return Nonecollection = Collection(collection_name) collection.load()return collectiondef export_partition_data(collection, partition_name, file: str):batch_size = 10output_fields=["pk", "random", "var", "embeddings"]query_iter = collection.query_iterator(batch_size=batch_size,output_fields = output_fields,partition_names=[partition_name])export_file = open(file, 'w')while True:docs = query_iter.next()if len(docs) == 0:# close the iteratorquery_iter.close()breakfor doc in docs:new_doc = {}new_doc_fields = {}for k, v in doc.items():if k == pk:# primary keynew_doc['pk'] = str(v)elif k == vector_field_name:new_doc['vector'] = [float(k) for k in v]else:new_doc_fields[k] = vnew_doc['fields'] = new_doc_fieldsjson.dump(new_doc, export_file)export_file.write('\n')export_file.close()if __name__ == "__main__":collection_name = "YOUR_MILVUS_COLLECTION_NAME"collection = load_collection(collection_name)pk = collection.schema.primary_field.namevector_field_name = collection.indexes[0].field_namedump_path_str = collection_name+'.dump'dump_path = Path(dump_path_str)dump_path.mkdir(parents=True, exist_ok=True)for partition in collection.partitions:partition_name = partition.nameif partition_name == '_default':export_path = dump_path_str + '/default.txt'else:export_path = dump_path_str + '/' + partition_name + ".txt"export_partition_data(collection, partition_name, export_path)
3. 将数据导入DashVector
3.1. 创建Cluster
参考DashVector官方用户手册构建Cluster。
3.2. 创建Collection
根据2.1章节中导出的Schema信息以及参考Dashvector官方用户手册来创建Collection。下面的示例代码会根据2.1章节中导出的schema.json来创建一个DashVector的Collection。
from dashvector import Client, DashVectorExceptionfrom pydantic import BaseModel
from typing import Dict, Type
import jsondtype_convert = {'int': int,'float': float,'bool': bool,'str': str
}class Schema(BaseModel):metrics: strdtype: Typedimension: intfields_schema: Dict[str, Type]@classmethoddef from_dict(cls, json_data):metrics = json_data['metrics']dtype = dtype_convert[json_data['dtype']]dimension = json_data['dimension']fields_schema = {k: dtype_convert[v] for k, v in json_data['fields_schema'].items()}return cls(metrics=metrics, dtype=dtype, dimension=dimension, fields_schema=fields_schema)def read_schema(schema_path) -> Schema:with open(schema_path) as file:json_data = json.loads(file.read())return Schema.from_dict(json_data)if __name__ == "__main__":milvus_dump_path = f"{YOUR_MILVUS_COLLECTION_NAME}.dump"milvus_dump_scheme_path = milvus_dump_path + "/schema.json"schema = read_schema(milvus_dump_scheme_path)client = dashvector.Client(api_key='YOUR_API_KEY',endpoint='YOUR_CLUSTER_ENDPOINT')# create collectionrsp = client.create(name="YOUR_DASHVECTOR_COLLECTION_NAME", dimension=schema.dimension, metric=schema.metrics, dtype=schema.dtype,fields_schema=schema.fields_schema)if not rsp:raise DashVectorException(rsp.code, reason=rsp.message)
3.3. 导入Data
根据2.2章节中导出的数据以及参考DashVector官方用户手册来批量插入Doc。下面的示例代码会依次解析各个Partition导出的数据,然后依次创建DashVector下的Partition并导入数据。
from dashvector import Client, DashVectorException, Docfrom pydantic import BaseModel
from typing import Dict, Type
import json
import glob
from pathlib import Pathdef insert_data(collection, partition_name, partition_file):if partition_name != 'default':rsp = collection.create_partition(partition_name)if not rsp:raise DashVectorException(rsp.code, reason=rsp.message)with open(partition_file) as f:for line in f:if line.strip():json_data = json.loads(line)rsp = collection.insert([Doc(id=json_data['pk'], vector=json_data['vector'], fields=json_data['fields'])])if not rsp:raise DashVectorException(rsp.code, reason=rsp.message) if __name__ == "__main__":milvus_dump_path = f"{YOUR_MILVUS_COLLECTION_NAME}.dump"client = dashvector.Client(api_key='YOUR_API_KEY',endpoint='YOUR_CLUSTER_ENDPOINT')# create collectioncollection = client.get("YOUR_DASHVECTOR_COLLECTION_NAME")partition_files = glob.glob(milvus_dump_path+'/*.txt', recursive=False)for partition_file in partition_files:# create partitionpartition_name = Path(partition_file).steminsert_data(collection, partition_name, partition_file)
相关文章:
从Milvus迁移DashVector
本文档演示如何从Milvus将Collection数据全量导出,并适配迁移至DashVector。方案的主要流程包括: 首先,升级Milvus版本,目前Milvus只有在最新版本(v.2.3.x)中支持全量导出其次,将Milvus Collection的Schema信息和数据…...

彻底改变计算机视觉的 Vision Transformer (ViT) 综合指南(视觉转换器终极指南)
欢迎来到雲闪世界。大家好!对于那些还不认识我的人,我叫 Francois,我是 Meta 的研究科学家。我热衷于解释先进的 AI 概念并使其更容易理解。 今天,让我们深入探讨计算机视觉领域最重要的贡献之一:Vision Transformer&…...

vue3 v-bind=“$attrs“ 的一些理解,透传 Attributes相关说明及事例说明
1、可能小伙伴们经常会在自己的项目中看到v-bind"$attrs",这个一般是在自定义组件中看到。 比如: <template><BasicModalv-bind"$attrs"register"registerModal":title"getTitle"ok"handleSubm…...

鸿蒙开发基础知识-页面布局【第四篇】
1.类型转换 2.交互点击事件 3.状态管理 4.forEch渲染和右上角图标 测试案例 Stack 层叠布局一个生肖卡 5. 动画展示图片 6. Swiper 轮播组件的基本使用 图片等比显示 aspectRatio()...
用CSS实现前端响应式布局
一、响应式布局的重要性 随着移动设备的普及,越来越多的用户通过手机、平板电脑等设备访问网页。如果网页不能适应不同的屏幕尺寸,就会出现布局混乱、内容显示不全等问题,严重影响用户体验。响应式布局可以确保网页在各种设备上都能保持美观…...
【docker】docker启动sqlserver
sqlserver-docker官方地址 # sqlserver不是从docker的中央仓库拉取的,而是从ms的仓库拉取的。 docker pull mcr.microsoft.com/mssql/server:2019-latest# 宿主机即docker程序运行的linux服务器 docker run -d \ --user root \ --name mssql2019 \ -e "ACCEPT…...

Python爬虫01
requests模块 文档 安装 pip/pip3 install requestsresponse.text 和 response.content的区别 1.response.text 等价于 response.content.decode("推测出的编码字符集")response.text 类型:str 编码类型:requests模块自动根据Http头部对…...

关于vue项目启动报错Error: error:0308010C:digital envelope routines::unsupported
周五啦,总结一下这周遇到的个别问题吧,就是关于启动项目的时候其他的东西都准备好了,执行命令后报错Error: error:0308010C:digital envelope routines::unsupported 这里看一下我标注的地方,然后总结一下就不难发现问题所在 查看…...

随笔1:数学建模与数值计算
目录 1.1 矩阵运算 1.2 基本数学函数 1.3 数值求解 数学建模与数值计算 是将实际问题通过数学公式和模型进行描述,并通过计算获得模型解的过程。这是数学建模中最基本也是最重要的环节之一。下面是详细的知识点讲解及相应的MATLAB代码示例。 1.1 矩阵运算 知识点…...

SDN架构详解
目录 1)经典的IP网络-分布式网络 2)经典网络面临的问题 3)SDN起源 4)OpenFlow基本概念 5)Flow Table简介 6)SDN的网络架构 7)华为SDN网络架构 8)传统网络 vs SDN 9…...

platform框架
platform框架 注册设备进入总线platform_device_register函数 注册驱动进入总线platform_driver_register函数 注册设备进入总线 platform_device_register函数 int platform_device_register(struct platform_device *pdev) struct platform_device {const char * name; 名…...
零成本搞定静态博客——十分钟安装hugo与主题
文章目录 hugo介绍hugo安装与使用方式一:新建站点自建主题方式二:新建站点使用系统推荐的主题 hugo介绍 通过 Hugo 你可以快速搭建你的静态网站,比如博客系统、文档介绍、公司主页、产品介绍等等。相对于其他静态网站生成器来说,…...
windows C++ 并行编程-转换使用取消的 OpenMP 循环以使用并发运行时
某些并行循环不需要执行所有迭代。 例如,搜索值的算法可以在找到值后终止。 OpenMP 不提供中断并行循环的机制。 但是,可以使用布尔值或标志来启用循环迭代,以指示已找到解决方案。 并发运行时提供允许一个任务取消其他尚未启动的任务的功能。…...
经验笔记:跨站脚本攻击(Cross-Site Scripting,简称XSS)
跨站脚本攻击(Cross-Site Scripting,简称XSS)经验笔记 跨站脚本攻击(XSS:Cross-Site Scripting)是一种常见的Web应用程序安全漏洞,它允许攻击者将恶意脚本注入到看起来来自可信网站的网页上。当…...

演示:基于WPF的DrawingVisual和谷歌地图瓦片开发的地图(完全独立不依赖第三方库)
一、目的:基于WPF的DrawingVisual和谷歌地图瓦片开发的地图 二、预览 三、环境 VS2022,Net7,DrawingVisual,谷歌地图瓦片 四、主要功能 地图缩放,平移,定位 真实经纬度 显示瓦片信息 显示真实经纬度和经纬线 省市县…...
【C++】static作用总结
文章目录 1. 在函数内(局部静态变量)2. 在类中的静态成员变量3. 在类中的静态成员函数4. 在文件/模块中的静态变量或函数总结 1. 在函数内(局部静态变量) 当 static 用于函数内的局部变量时,该变量的生命周期变为整个…...

视频提取字幕的软件有哪些?高效转录用这些
探索视频的奥秘,从字幕开始!你是否曾被繁复的字幕处理困扰,渴望有一款简单好用的在线免费软件来轻松解锁字幕提取? 告别手动输入的烦恼,我们为你精选了6款视频字幕提取在线免费软件,它们不仅能一键转录&am…...

(4)SVG-path中的椭圆弧A(绝对)或a(相对)
1、概念 表示经过起始点(即上一条命令的结束点),到结束点之间画一段椭圆弧 2、7个参数 rx,ry,x-axis-rotation,large-arc-flag,sweep-flag,x,y (1)和(2&a…...
docker国内镜像源报错解决方案
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details. 遇到 Job for docker.service failed because the control process exited with error …...
《C++进阶之路:探寻预处理宏的替代方案》
在 C编程的历程中,预处理宏曾经扮演了重要的角色。然而,随着 C语言的不断发展和编程理念的进步,预处理宏的一些弊端也逐渐显现出来。那么,C中的预处理宏的替代方案有哪些呢?本文将深入探讨这个问题,为你揭示…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...