milvus insert api的数据结构源码分析

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
简介: milvus insert api的数据结构源码分析

insert api的数据结构

一个完整的insert例子:

import numpy as np
from pymilvus import (
    connections,
    FieldSchema, CollectionSchema, DataType,
    Collection,
)

num_entities, dim = 10, 3

print("start connecting to Milvus")
connections.connect("default", host="192.168.230.71", port="19530")

fields = [
    FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="book_id", dtype=DataType.INT64),
    FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim)
]

schema = CollectionSchema(fields, "hello_milvus is the simplest demo to introduce the APIs")

print("Create collection `hello_milvus`")
hello_milvus = Collection("hello_milvus", schema, consistency_level="Eventually",shards_num=1)


print("Start inserting entities")
rng = np.random.default_rng(seed=19530)
entities = [
    [i for i in range(num_entities)],  # field book_id
    rng.random((num_entities, dim)),    # field embeddings
]

insert_result = hello_milvus.insert(entities)

hello_milvus.flush()

InsertRequest数据结构:

type InsertRequest struct {
   
   
    Base                 *commonpb.MsgBase
    DbName               string
    CollectionName       string
    PartitionName        string
    FieldsData           []*schemapb.FieldData
    HashKeys             []uint32
    NumRows              uint32
    XXX_NoUnkeyedLiteral struct{
   
   }
    XXX_unrecognized     []byte
    XXX_sizecache        int32
}

FieldsData是一个数组,如果insert有3列,则数组长度为3,按照插入顺序。

FieldData数据结构:

type FieldData struct {
   
   
    Type      DataType 
    FieldName string   
    // Types that are valid to be assigned to Field:
    //
    //    *FieldData_Scalars
    //    *FieldData_Vectors
    Field                isFieldData_Field
    FieldId              int64
    IsDynamic            bool
    XXX_NoUnkeyedLiteral struct{
   
   }
    XXX_unrecognized     []byte
    XXX_sizecache        int32
}

isFieldData_Field是一个接口:

type isFieldData_Field interface {
   
   
    isFieldData_Field()
}

它有2个实现:FieldData_Scalars和FieldData_Vectors。

type FieldData_Scalars struct {
   
   
    Scalars *ScalarField
}

type FieldData_Vectors struct {
   
   
    Vectors *VectorField
}

FieldData_Scalars存储标量数据,FieldData_Vectors存储向量数据。

ScalarField数据结构:

type ScalarField struct {
   
   
    // Types that are valid to be assigned to Data:
    //
    //    *ScalarField_BoolData
    //    *ScalarField_IntData
    //    *ScalarField_LongData
    //    *ScalarField_FloatData
    //    *ScalarField_DoubleData
    //    *ScalarField_StringData
    //    *ScalarField_BytesData
    //    *ScalarField_ArrayData
    //    *ScalarField_JsonData
    Data                 isScalarField_Data
    XXX_NoUnkeyedLiteral struct{
   
   }
    XXX_unrecognized     []byte
    XXX_sizecache        int32
}

isScalarField_Data是一个接口。

type isScalarField_Data interface {
   
   
    isScalarField_Data()
}

isScalarField_Data的实现有9个:

  • ScalarField_BoolData
  • ScalarField_IntData
  • ScalarField_LongData
  • ScalarField_FloatData
  • ScalarField_DoubleData
  • ScalarField_StringData
  • ScalarField_BytesData
  • ScalarField_ArrayData
  • ScalarField_JsonData

以ScalarField_LongData为例:

type ScalarField_LongData struct {
   
   
    LongData *LongArray
}

type LongArray struct {
   
   
    Data                 []int64
    XXX_NoUnkeyedLiteral struct{
   
   }
    XXX_unrecognized     []byte
    XXX_sizecache        int32
}

VectorField数据结构:

type VectorField struct {
   
   
    Dim int64
    // Types that are valid to be assigned to Data:
    //
    //    *VectorField_FloatVector
    //    *VectorField_BinaryVector
    //    *VectorField_Float16Vector
    Data                 isVectorField_Data
    XXX_NoUnkeyedLiteral struct{
   
   }
    XXX_unrecognized     []byte
    XXX_sizecache        int32
}

isVectorField_Data是一个接口。

type isVectorField_Data interface {
   
   
    isVectorField_Data()
}

isVectorField_Data有3种实现:

  • VectorField_FloatVector
  • VectorField_BinaryVector
  • VectorField_Float16Vector

以VectorField_FloatVector为例:

type VectorField_FloatVector struct {
   
   
    FloatVector *FloatArray
}

type FloatArray struct {
   
   
    Data                 []float32
    XXX_NoUnkeyedLiteral struct{
   
   }
    XXX_unrecognized     []byte
    XXX_sizecache        int32
}

案例

向hello_milvus插入10个3维向量。

num_entities, dim = 10, 3
rng = np.random.default_rng(seed=19530)
entities = [
    [i for i in range(num_entities)],
    rng.random((num_entities, dim)), 
]
insert_result = hello_milvus.insert(entities)

scalar_data.jpg

vector_data.jpg

FloatVector是一个长度为30的float32数组,插入的是10个3维向量,1个向量是3个float32,在这里展开了。

目录
相关文章
|
6月前
|
存储 SQL API
milvus insert api流程源码分析
milvus insert api流程源码分析
270 3
|
6月前
|
存储 编解码 网络协议
FFmepg 核心开发库及重要数据结构与API
FFmepg 核心开发库及重要数据结构与API
69 0
|
6月前
|
JSON 缓存 应用服务中间件
开源API网关APISIX源码分析(一)
开源API网关APISIX源码分析
274 0
|
5月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
83 1
|
4月前
|
消息中间件 存储 NoSQL
Redis数据结构—跳跃表 skiplist 实现源码分析
Redis 是一个内存中的数据结构服务器,使用跳跃表(skiplist)来实现有序集合。跳跃表是一种概率型数据结构,支持平均 O(logN) 查找复杂度,它通过多层链表加速查找,同时保持有序性。节点高度随机生成,最大为 32 层,以平衡查找速度和空间效率。跳跃表在 Redis 中用于插入、删除和按范围查询元素,其内部节点包含对象、分值、后退指针和多个前向指针。Redis 源码中的 `t_zset.c` 文件包含了跳跃表的具体实现细节。
|
6月前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
153 3
|
6月前
|
缓存 安全 应用服务中间件
开源API网关APISIX源码分析(二)
开源API网关APISIX源码分析(二)
266 0
|
6月前
|
存储 Java API
你了解SpringBoot启动时API相关信息是用什么数据结构存储的吗?(上篇)
你了解SpringBoot启动时API相关信息是用什么数据结构存储的吗?(上篇)
65 0
|
14天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
90 9
|
5天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
14 1