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

2023-12-01 21:35:21 浏览数 (2)

测试数据来自:【腾讯云云上实验室-向量数据库】——测试数据集——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倍】,这是实打实的测试数据,有兴趣的可以自己测试一下。

0 人点赞