从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中的预处理宏的替代方案有哪些呢?本文将深入探讨这个问题,为你揭示…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...