前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【腾讯云云上实验室-向量数据库】——添加测试数据方法对照实验

【腾讯云云上实验室-向量数据库】——添加测试数据方法对照实验

作者头像
红目香薰
修改2023-12-01 21:35:21
2740
修改2023-12-01 21:35:21
举报
文章被收录于专栏:CSDNToQQCodeCSDNToQQCode

测试数据来自:【腾讯云云上实验室-向量数据库】——测试数据集——Embedding——text数据(json序列化)-CSDN博客

云数据库首页

登录 - 腾讯云

登录 - 腾讯云

数据库规格

我这里使用的是基础规格,可以自己申请一下高级的版本说不定运气好呢。

测试数据库:【向量数据库】 版本:【免费测试版】 节点类型:【基础型】 节点规格:【1核1G】 节点数量:【1】 磁盘容量:【单节点磁盘容量20GB,总磁盘容量20GB】 当前磁盘空间:【5MB/20GB】

当前基本是空的数据库。数据格式大概是这样的。开了【embedding】加了三个索引。

数据集可以看上面给的文章链接,不做过多说明。

测试情况1、循环添加数据

这种方法纯粹的是为了浪费时间准备的,看看与第二种累计集合能差出多少效率。

代码语言:javascript
复制
import tcvectordb
from tcvectordb.model.document import Document
from tcvectordb.model.enum import ReadConsistency
import re
import time

client = tcvectordb.VectorDBClient(url='http://lb3ls.clb.ap-guangzhou.tencentclb.com:40000',
                                   username='root', key='EgERjI66zZq2pBilNQO',
                                   read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
# 指定写入原始文本的数据库与集合
db = client.database('mygame_db')
coll = db.collection('skill_info')

files = open("skill.txt", "r", encoding="utf-8")
arr = []  # temp
for item in files.readlines():
    if item.__eq__("\n") or item.__eq__("\r"):
        continue
    arr.append(item.split()[0])

arr_list = []  # 总
title = ""
count = 0
for item in arr:
    result1 = re.match(r"\d.", item, re.I)
    if result1 == None:
        lists = {}  # 单
        count += 1
        lists["id"] = count
        lists["title"] = title
        temp = item.split(":")
        lists["skill_name"] = temp[1]
        lists["skill_info"] = temp[2]
        arr_list.append(lists)
    else:
        title = item.replace(":", "").split(".")[1]
print(arr_list)
print("******"*20)
current_time_start = time.perf_counter()
docs = []
for item in arr_list:
    st_info = '{}:{}:{}'.format(item["title"], item["skill_name"], item["skill_info"])
    res = coll.upsert(
        documents=[
            Document(id=str(item["id"]),
                     text=st_info,
                     title=item["title"],
                     skill_name=item["skill_name"],
                     skill_info=item["skill_info"],
                     )
        ]
    )
current_time_end = time.perf_counter()
print("时间:", (current_time_end - current_time_start), "秒")

测试效果:这里时间消耗的比较多,共计可以在ID上看到数据的条数149条,总计时间13.49秒,时间已经很长了,接下来换一种方法,先累加后面一起添加。 

测试情况2、制作集合数据一次性添加

这种方法是将数据都放在一个集合中,最后将所有的数据都一次性放入到数据库里面,好处是不用每次向数据库请求添加数据,来回请求的时间省略了,故而完全可以预计这种方法的效率会大大的提升。

代码语言:javascript
复制
import tcvectordb
from tcvectordb.model.document import Document
from tcvectordb.model.enum import ReadConsistency
import re
import time

client = tcvectordb.VectorDBClient(url='http://.ap-guaclb.com:40000',
                                   username='root', key='EgERjI6ilNQO',
                                   read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
# 指定写入原始文本的数据库与集合
db = client.database('mygame_db')
coll = db.collection('skill_info')

files = open("skill.txt", "r", encoding="utf-8")
arr = []  # temp
for item in files.readlines():
    if item.__eq__("\n") or item.__eq__("\r"):
        continue
    arr.append(item.split()[0])

arr_list = []  # 总
title = ""
count = 0
for item in arr:
    result1 = re.match(r"\d.", item, re.I)
    if result1 == None:
        lists = {}  # 单
        count += 1
        lists["id"] = count
        lists["title"] = title
        temp = item.split(":")
        lists["skill_name"] = temp[1]
        lists["skill_info"] = temp[2]
        arr_list.append(lists)
    else:
        title = item.replace(":", "").split(".")[1]
print(arr_list)
print("******" * 20)
current_time_start = time.perf_counter()
docs = []
for item in arr_list:
    st_info = '{}:{}:{}'.format(item["title"], item["skill_name"], item["skill_info"])
    docs.append(
        Document(id=str(item["id"]),
                 text=st_info,
                 title=item["title"],
                 skill_name=item["skill_name"],
                 skill_info=item["skill_info"],
                 )
    )
print(docs)
print("******" * 20)
res = coll.upsert(
    documents=docs
)
current_time_end = time.perf_counter()
print("时间:", (current_time_end - current_time_start), "秒")

具体的时间:

数据计算

这里基本可以进行一下消耗计算。

测试1的情况是:13.49s

测试2的情况是:0.85s

我们都用大致的数据来测试,0.01的模糊差不多。

总计数量149条数据,数据大小在【13k】左右,具体是的:13.2 KB (13,616 字节)

测试1每次提交消耗时间:总时间/149=每次,约=13.49/149=0.0905s/次添加。

测试2提交一次,总消耗时间是:0.85s,也就是这次添加的时间是0.85s。除了正常TCP连接外就是上传了大概13.2K的数据。

我们再来第三次测试,这回只添加一个数据,使用的是【测试1】的编码。

运行时间结果:

单次的时间是0.091秒,这样算下来平均都是差不多的,与测试1的结果基本相同。

这样我们模糊的计算一下,单次的上传内容时间我们先忽略,使用0.85-0.09=0.74s,这样上传149次的时间约0.74s,除一下看看,0.74/149=0.00496s,也就是4.96微妙,上传一个对象。

插入数据库的最好方案

1. 批量插入:如果你需要插入大量数据,尽可能使用批量插入而非逐条插入。批量插入可以大大减少数据库操作的次数,提高效率。 2. 事务:在插入大量数据时,使用事务可以确保数据的一致性。如果插入过程中出现错误,你可以回滚整个事务,确保数据库的一致性和完整性。 3. 禁用索引和约束:在大量数据插入时,暂时禁用索引和约束可以提高效率,插入完成后再重建索引和约束。 4. 使用适当的存储过程和函数:存储过程和函数可以在数据库级别优化操作,减少网络往返,提高性能。 5. 优化数据结构和设计:良好的数据库设计和数据结构可以提高插入效率。例如,合理地选择数据类型,避免不必要的复杂数据类型和大量的 NULL 值。 6. 并行插入:如果你的数据库支持并行处理,你可以尝试并行插入数据以提高性能。但请注意,并行处理并不总是能提高性能,因为它可能会增加系统开销,所以需要根据实际情况进行测试和调整。

虽然不是向量数据的单独优化方案,但是这种优化方案应该能适用于向量数据库,毕竟我们已经在上面的测试中得到了实际结果,是真的快了【16倍】,这是实打实的测试数据,有兴趣的可以自己测试一下。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 云数据库首页
  • 数据库规格
  • 测试情况1、循环添加数据
  • 测试情况2、制作集合数据一次性添加
  • 数据计算
  • 插入数据库的最好方案
相关产品与服务
向量数据库
腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持千亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、自然语言处理等 AI 领域。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档