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