milvus向量数据库导入以及文件导入性能数据

向量数据库数据导入

milvus-cli导入 (功能不稳定)

连接方式(milvus_cli)

docker run -v ${宿主机目录}:${容器内部目录} --network host  -it zilliz/milvus_cli:latest 

数据导入方式(只能导入csv或者json格式)

insert -c ${集合名} -d ${分区} ${数据文件地址}

pymilvus导入(推荐方式)

导入概述

将任意格式数据来源转化为list中包含dict的数据格式后进行插入

[{"vector":[1,2,3],"color":1,"brand":2},
​
{"vector":[1,2,3],"color":1,"brand":2}]

npy导入样例

npy数据样例(512位向量)

(10 * 513的数据文件)

测试集合结构
{
    'collection_name': 'id_test',
    'auto_id': True,
    'num_shards': 1,
    'description': '',
    'fields': [{
        'field_id': 100,
        'name': 'id',
        'description': '',
        'type': < DataType.INT64: 5 > ,
        'params': {},
        'auto_id': True,
        'is_primary': True
    }, {
        'field_id': 101,
        'name': 'vector',
        'description': '',
        'type': < DataType.FLOAT_VECTOR: 101 > ,
        'params': {
            'dim': 512
        }
    }, {
        'field_id': 102,
        'name': 'user',
        'description': '',
        'type': < DataType.INT64: 5 > ,
        'params': {}
    }],
    'aliases': [],
    'collection_id': 449008755109392222,
    'consistency_level': 2,
    'properties': {},
    'num_partitions': 1,
    'enable_dynamic_field': False
}
npy格式文件导入code(示例)
import numpy as np
from pymilvus import MilvusClient
​
collection_name = "id_test"
client = MilvusClient(
    uri="http://xxxxx:19530"
)
# 读取.npy文件
filename = "data.npy"
data = np.load(filename)
insert_data = []
# 指定要提取的列索引以及向量数据的范围,假设第一列为user_id,后续512列为向量
id_index = 0
start_index = 1
end_index = 513
# 遍历每一行
for row in data:
    vector = row[start_index:end_index].astype(float)
    # 提取指定列数据
    user_id = row[id_index].astype(int)
    #每一行组装为字典数据
    row_data = {"vector": vector, "user": user_id}
    insert_data.append(row_data)
print(insert_data)
res = client.insert(
    collection_name=collection_name,
    data=insert_data
)

CSV导入样例

CSV数据样例(32位向量)
vector,color,brand
"[-0.7209183664844216, 0.8711053876779193, 0.9964217845088184, 0.6231620813215315, 0.7918401115762204, 0.6459907382976304, -0.24449705344348627, 0.5283286331488382, -0.17982155969060365, 0.8378458891464253, 0.37783508288987555, -0.4628324550213916, 0.6581650509576793, 0.6071805318064338, 0.4498795735649994, -0.7750999466447372, -0.6462082414609587, -0.580388413445476, 0.8981473701593645, 0.07818571472661451, -0.5864306922180489, -0.16207520167186562, -0.9907683953944031, -0.4744881016805491, 0.8176021236939539, 0.08151555622128459, 0.6256771902239864, 0.3861348883342641, 0.09309366607546044, -0.7791598062940868, 0.8306950004781792, -0.10447828701244677]",501680546,521294227

测试集合结构
{
    'collection_name': 'car',
    'auto_id': True,
    'num_shards': 1,
    'description': '',
    'fields': [{
        'field_id': 100,
        'name': 'id',
        'description': 'primary_field',
        'type': < DataType.INT64: 5 > ,
        'params': {},
        'auto_id': True,
        'is_primary': True
    }, {
        'field_id': 101,
        'name': 'vector',
        'description': '',
        'type': < DataType.FLOAT_VECTOR: 101 > ,
        'params': {
            'dim': 128
        }
    }, {
        'field_id': 102,
        'name': 'color',
        'description': 'color',
        'type': < DataType.INT64: 5 > ,
        'params': {}
    }, {
        'field_id': 103,
        'name': 'brand',
        'description': 'brand',
        'type': < DataType.INT64: 5 > ,
        'params': {}
    }],
    'aliases': [],
    'collection_id': 449008755105781201,
    'consistency_level': 2,
    'properties': {},
    'num_partitions': 1,
    'enable_dynamic_field': False
}
csv格式文件导入code(示例)
import pandas as pd
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, MilvusClient
​
# 连接 Milvus
client = MilvusClient(
    uri="http://xxxxx:19530"
)
# 从 CSV 文件读取数据
csv_file_path = 'xxxx.csv'
df = pd.read_csv(csv_file_path)
# 注意处理向量列的数据类型
df['vector'] = df['vector'].apply(lambda x: [float(i) for i in x.strip('[]').split(',')])
​
dict=df.to_dict(orient="records")
res = client.insert(
    collection_name="car",
    data=dict
)
#返回主键id
print(res)

注意

  • 确保数据中的列名与Schema中的字段标签名相同。

  • 使用python单次导入数据大小不应过大,应小于350MB,以便正确导入数据,否则会遇到如下报错。

  • 向量数据库导入
  • 过大数据的导入采用代码中数据切分的模式进行数据导入

具体数据(在相同服务器进行,本次测试数据来源于单体部署milvus)

向量维度数据量行数 w数据量大小 m导入时间 s
641130.14
645670.68
64101351.39
64202702.82
64253383.23
1281260.24
12851341.00
128102681.84
128112952.25
128123222.36
2561530.31
25652671.67
25663201.76
51211060.61
51222131.68
51233191.69

(远程导入数据可能受到网络io瓶颈的影响)

### Milvus 向量数据库多维度数据处理方法 Milvus 支持多种数据类型的向量,包括浮点型、整型和二进制数据,这使得它能够在不同场景下满足多样化的数据需求[^1]。对于多维数据的处理,Milvus 提供了一套完整的解决方案,涵盖了从数据导入、索引建立到查询优化的过程。 #### 数据导入与预处理 在将多维数据导入 Milvus 之前,通常需要对其进行预处理。预处理过程可能涉及特征提取、标准化或归一化等操作。这些步骤有助于提高后续向量相似度搜索的效率和准确性。例如,在图像识别应用场景中,可以使用深度神经网络来生成图片的嵌入向量,并将其作为输入提供给 Milvus 进行存储和管理[^2]。 ```python import numpy as np from milvus import Milvus, DataType client = Milvus(host='localhost', port='19530') collection_param = { 'fields': [ {'name': 'id', 'type': DataType.INT64}, {'name': 'embedding', 'type': DataType.FLOAT_VECTOR, 'params': {'dim': 128}} ], 'segment_row_limit': 4096, } status = client.create_collection('example_collection', collection_param) print(f"Collection creation status: {status}") ``` 这段代码展示了如何定义一个多维向量集合并创建相应的表结构。这里设置了一个名为 `embedding` 的字段用于保存 128 维的浮点数向量。 #### 索引建立与优化 为了加快大规模向量库上的近似最近邻 (ANN) 查询速度,Milvus 实现了几种高效的索引算法,如 IVF_FLAT、IVF_SQ8 及 HNSW 等。通过合理配置参数,可以在精度和性能之间找到最佳平衡点。此外,还可以利用 GPU 加速功能进一步提升计算效能[^4]。 ```json { "index_type": "IVF_FLAT", "metric_type": "L2", "params": {"nlist": 1024} } ``` 上述 JSON 片段说明了为一个特定集合指定索引类型及其相关参数的方式。其中 `"index_type"` 表明采用的是基于倒排文件列表的方法;而 `"metric_type"` 则指定了距离度量标准——欧氏距离平方(即 L2 范数)。最后,“`params`”部分设置了聚类中心的数量 (`nlist`) 来控制索引粒度。 #### 应用场景举例 由于具备强大的非结构化数据分析能力,Milvus 已经广泛应用于多个行业领域: - **推荐系统**:通过对用户行为日志建模得到兴趣偏好表示向量,从而实现个性化商品推送服务; - **计算机视觉**:借助卷积神经网络抽取目标物体特征描述子,完成跨平台多媒体资源匹配任务; - **自然语言处理**:运用词袋模型或者 BERT 预训练框架获取文本语义表达形式,辅助文档分类、情感分析等工作流程自动化执行。 综上所述,凭借其卓越的性能表现、灵活易用的设计理念以及丰富全面的功能特点,Milvus 成为了构建高效向量搜索系统不可或缺的重要工具之一[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值