当前位置: 首页 > news >正文

果蔬识别系统性能优化之路(三)

目录

    • 前情提要
      • 遗留问题
    • 解决方案
      • 优化查询速度
      • 优化ivf初始化的速度
    • 下一步

前情提要

果蔬识别系统性能优化之路(二)

遗留问题

  1. 优化同步速度,目前大约30秒,不是一个生产速度
    这次来解决遗留问题

通过console,发现两个地方特别耗时,一个是查询数据,另一个是初始化ivf

 /*** 同步redis* @param storeCode*/async syncRedis(storeCode: string) {let s = Date.now();const featureDatabase = await this.findAll(storeCode);let e = Date.now();console.log(`查询耗时1:${e - s}ms`);const ids = featureDatabase.map(({ id }) => id);await this.redisService.set(`${storeCode}-featureDatabase`, JSON.stringify(ids));s = Date.now();const url = 'http://localhost:5000/sync'; // Python 服务的 URLawait firstValueFrom(this.httpService.post(url, { data: featureDatabase, storeCode }));e = Date.now();console.log(`查询耗时3:${e - s}ms`);}

在这里插入图片描述

解决方案

优化查询速度

之前使用的是FIND_IN_SET方法对类似1,2,3这样的数据进行包含条件的查询,速度太慢了,优化后:

/*** 查询所有* @param storeCode*/async findAll(storeCode: string) {return await this.featureRepository.createQueryBuilder('feature').select(['feature.id', 'feature.features']).where('feature.storeCode REGEXP :storeCode', { storeCode: `(^|,)${storeCode}(,|$)` }).getMany();}

效果提升了一倍:
在这里插入图片描述

优化ivf初始化的速度

当前的初始化方法

 def __init__(self, features, nlist=100, m=16, n_bits=8):d = features.shape[1]# 创建量化器quantizer = faiss.IndexFlatL2(d)  # 使用L2距离进行量化self.index = faiss.IndexIVFPQ(quantizer, d, nlist, m, n_bits)# 训练索引self.index.train(features)self.index.add(features)  # 将特征向量添加到索引中

优化方法:

  1. 增加并行化处理
# 设置线程数,例如使用所有可用的CPU核心
faiss.omp_set_num_threads(num_threads)  # num_threads 是你希望使用的线程数量
  1. 减少索引的复杂度
    减少nlist和m的值,但这样会损失精度,先不采用
  2. 使用增量添加数据
    分批处理可以分散压力,同时利用数据流式处理的优势。
batch_size = 1000  # 每次处理1000个特征
for i in range(0, len(features), batch_size):self.index.add(features[i:i+batch_size])
  1. 更换其他索引类型
self.index = faiss.IndexIVFFlat(quantizer, d, nlist)

下一步

  1. 新建store_feature表,关联storeCode和featureId表,对数据库进行规范化,创建一个新的表来映射storeCode与feature的关系,从而可以使用简单的WHERE条件来充分利用索引
  2. 实现对特征向量ivf的增删改查
http://www.lryc.cn/news/435188.html

相关文章:

  • 时序预测|基于小龙虾优化高斯过程GPR数据回归预测Matlab程序COA-GPR 多特征输入单输出 附赠基础GPR
  • C#进阶-快速了解IOC控制反转及相关框架的使用
  • C++内存布局
  • 【Linux 19】线程概念
  • [区间dp]添加括号
  • jenkins流水线+k8s部署springcloud微服务架构项目
  • 安卓开发板_联发科MTK开发评估套件串口调试
  • vue+el-table 可输入表格使用上下键进行input框切换
  • 中国书法——孙溟㠭浅析碑帖《三希堂法帖》
  • 深入探讨生成对抗网络(GANs):颠覆传统的AI创作方式
  • vmware Vnet8虚拟网卡丢失的找回问题
  • Python 从入门到实战13(字符串简介)
  • Redis_RDB持久化
  • SOP流程制定:vioovi ECRS工时分析软件的智慧引领
  • 并发编程-synchronized解决原子性问题
  • CSS之我不会
  • AI绘画:SD打光神器!(Stable Diffusion进阶篇:Imposing Consistent Light)
  • QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第二期]
  • 参赛心得和思路分享:2021第二届云原生编程挑战赛2: 实现一个柔性集群调度机制
  • 具体函数的卡诺图填入
  • STM32 HAL freertos零基础(六)计数型信号量
  • Dynamics CRM Ribbon Workbench-the solution contains non-entity components
  • 谷歌对抗司法部:为什么谷歌的“数百个竞争对手”说法站不住脚
  • 重生奇迹MU 沉迷升级的快感 法魔升级机器人
  • 从地图到智能地图:空间索引技术如何改变我们的世界
  • 深入理解AI Agent架构,史上最全解析!赶紧码住!
  • 苹果iOS/ iPadOS18 RC 版、17.7 RC版更新发布
  • CAN集线器(工业级、隔离式)
  • 代码随想录训练营 Day57打卡 图论part07 53. 寻宝(prim,kruskal算法)
  • Hibernate QueryPlanCache 查询计划缓存引发的内存溢出