果蔬识别系统性能优化之路(四)
目录
- 前情提要
- 剩下问题
- 问题排查
- 解决方案
- 下一步
前情提要
果蔬识别系统性能优化之路(三)
剩下问题
同步数据库数据并初始化ivf依然要8,9秒
问题排查
通过断点加时间打印,发生其实初始化ivf的时间很快,慢的是数据在网络间的传输,并在python端的数据解析,无语



本地调本地,都要十秒,这不合理,改!
解决方案
因为这里必须要查一次全量数据,然后存入redis并将特征值传给python端进行初始化,所以最快的方案就是舍弃数据传输,直接在python端进行查询并初始化,即在python端查全量数据+设置redis+初始化ivf,虽然不想承认,但确实把python端做重在架构和设计层面可能都是最优解,改吧
- python端增加mysql查询
import mysql.connector
from mysql.connector import pooling# 配置数据库连接
db_config = {'host': 'localhost', # 替换为你的 MySQL 主机地址'user': 'root', # 替换为你的 MySQL 用户名'password': 'cmkkl407', # 替换为你的 MySQL 密码'database': 'cnn' # 替换为你的数据库名称
}
pool = pooling.MySQLConnectionPool(pool_name="mypool", pool_size=5, **db_config)def get_feature_by_store_code(store_code):query = "SELECT id, features FROM feature WHERE storeCode REGEXP %s"results = query_data(query, params=(f"(^|,){store_code}(,|$)",))return resultsdef query_data(query, params):connection = pool.get_connection()cursor = connection.cursor(dictionary=True)cursor.execute(query, params)results = cursor.fetchall()cursor.close()connection.close() # 连接会被返回到池中return results
- 修改sync方法
def sync(self, store_code):if store_code + '-featureDatabase' in self.ivfObj:del self.ivfObj[store_code + '-featureDatabase']data = get_feature_by_store_code(store_code)def parse_features(item):return orjson.loads(item['features'])with ThreadPoolExecutor() as executor:features_list = list(executor.map(parse_features, data))# 提取所有特征并转换为 NumPy 数组features = np.array(features_list, dtype=np.float32)self.ivfObj[store_code + '-featureDatabase'] = IVFPQ(features)ids = [item['id'] for item in data]return ids
由于python端查出来的json默认会给字符串格式,所以还需要转成json
一个优化小点:
并行处理:使用多线程或多进程并行处理数据。可以使用 concurrent.futures 库中的 ThreadPoolExecutor 或 ProcessPoolExecutor 来加快解析速度。
def parse_features(item):return orjson.loads(item['features'])with ThreadPoolExecutor() as executor:features_list = list(executor.map(parse_features, data))
同时利用查出了所有id将ids进行返回给nestjs端直接进行redis存储
4. nestjs端修改
/*** 同步redis* @param storeCode*/async syncRedis(storeCode: string) {const url = 'http://localhost:5000/sync'; // Python 服务的 URLconst s = Date.now();const response = await firstValueFrom(this.httpService.post(url, { storeCode }));const { ids } = response.data;await this.redisService.set(`${storeCode}-featureDatabase`, JSON.stringify(ids));const e = Date.now();console.log(`同步redis耗时:${e - s}ms`);}
- 优化后速度减少了一倍

下一步
- 新建store_feature表,关联storeCode和featureId表,对数据库进行规范化,创建一个新的表来映射storeCode与feature的关系,从而可以使用简单的WHERE条件来充分利用索引
- 实现对特征向量ivf的增删改查
相关文章:
果蔬识别系统性能优化之路(四)
目录 前情提要剩下问题 问题排查解决方案下一步 前情提要 果蔬识别系统性能优化之路(三) 剩下问题 同步数据库数据并初始化ivf依然要8,9秒 问题排查 通过断点加时间打印,发生其实初始化ivf的时间很快,慢的是数据在网络间的传…...
kafka之protobuf
Protobuf 的 .proto 文件是一种描述消息结构的定义文件,使用这种文件可以定义数据结构(消息),然后生成对应语言的类或代码用于序列化和反序列化数据。生成 .proto 文件涉及到编写 .proto 文件定义,然后通过 protoc 编译…...
BARTBERT
BART和BERT都是基于Transformer架构的预训练语言模型。 模型架构: BERT (Bidirectional Encoder Representations from Transformers) 主要是一个编码器(Encoder)模型,它使用了Transformer的编码器部分来处理输入的文本࿰…...
C++ 11新特性(1)
文章目录 C11新特性之auto和decltype知识点autoauto推导规则什么时候使用auto? decltypedecltype推导规则 auto和decltype的配合使用 C11新特性之左值引用、右值引用、移动语义、完美转发左值、右值纯右值、将亡值纯右值将亡值左值引用、右值引用 移动语义深拷贝、浅…...
彻底理解浅拷贝和深拷贝
目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象,这个对象具有原对象属性的精确副本 基本数据类型(如字符串、数字等),在浅拷贝过程中它们是通过值传递的,而不是引用传递,修改值并不…...
Spring4-IoC2-基于注解管理bean
目录 开启组件扫描 使用注解定义bean Autowired注入 场景一:属性注入 场景二:set注入 场景三:构造方法注入 场景四:形参注入 场景五:只有一个构造函数,无注解 场景六:Autowired和Quali…...
AI基础 L22 Uncertainty over Time I 时间的不确定性
Time and Uncertainty 1 Time and Uncertainty States and Observations • discrete-time models: we view the world as a series of snapshots or time slices • the time interval ∆ between slices, we assume to be the same for every interval • Xt: denotes the se…...
中小型企业网络构建
1 什么是 VLAN? VLAN,指的是虚拟局域网,是一种 2 层技术。可以在交换机上实现广播域的隔离。从而可以减小 数据广播风暴对交换网络的影响,降低了网络管理难度,同时可以实现网络规模的灵活扩展。 2 Trunk 链路与 Acces…...
PXE服务
一.PXE服务的功能介绍 1.无盘启动:PXE允许计算机在没有本地存储设备的情况下启动操作系统。这对于构建无盘工作站非常有用,因为计算机可以直接从网络加载操作系统和其他应用程序1。 2.远程安装操作系统:PXE技术可以用于远程安装操作系统&…...
Docker技术深度解析与实践应用
Docker技术深度解析与实践应用 引言 在现代软件开发与部署的浪潮中,Docker作为一种轻量级的容器化技术,凭借其高效、一致和灵活的特性,逐渐成为云原生应用开发和部署的基石。本文将深入探讨Docker的核心概念、技术原理、实践应用࿰…...
链动321模式小程序开发源码
链动31模式概述 链动31模式是一种基于技术的新型商业模式,它通过激励用户分享和推广,实现用户、企业和平台的共赢。该模式通常涉及商品展示、积分系统、分享推广和排行榜等功能,旨在通过用户之间的社交裂变来扩大销售和品牌影响力。如何开发这…...
java开发中间件学习记录(持续更新中~)
1 Redis 2JVM 3 java基础底层 4Mysql 5 spring 6 微服务 7.......(持续更新) One:Redis篇 1:Redis 1.穿透 1.1缓存穿透 1.1.1布隆过滤器 1.2缓存击穿 2:击穿 1.3:缓存雪崩 1.4:双写一致 1.5.持久化(RDB,AOF) 1.6…...
(批处理)无限弹窗cmd
代码部分 echo off echo 好了,可以退出了 pause>nul echo 再点就要无限弹窗了! pause >nul echo 你还点? pause >nul echo 再给你最后一次机会,别点了,再点准备重启 pause >nul echo 点击任意键变身奥特曼…...
解决ubuntu 24.04 ibus出现卡死、高延迟问题
问题描述 ubuntu中使用ibus经常会出现卡死、高延迟的问题,网上找了一些解决方法就手动输入命令是重启。但是键盘卡死了没法输入,不能很有效的解决问题。 解决思路 通过一个bash脚本监测ibus进程,当出现进程卡死的时候自动重启。 bash代码…...
减少脏页标记技术中处理时间的方法
减少脏页标记技术中处理时间的方法 一、引言 在数据库系统中,脏页标记技术对于确保数据的一致性和持久性至关重要。然而,脏页标记过程可能会消耗一定的处理时间,影响数据库的性能。因此,寻找有效的方法来减少脏页标记技术中的处理时间具有重要意义。 二、优化数据结构 …...
828华为云征文 | 华为云Flexusx与Docker技术融合,打造个性化WizNote服务
前言 华为云Flexus X实例携手Docker技术,创新融合打造高效个性化WizNote服务。华为云Flexus X实例的柔性算力与Docker的容器化优势相结合,实现资源灵活配置与性能优化,助力企业轻松构建稳定、高效的云端笔记平台。828华为云企业上云节特惠来袭…...
JavaScript事件处理和常用对象
文章目录 前言一、事件处理程序 1.JavaScript 常用事件2.事件处理程序的调用二、常用对象 1.Window 对象2.String 对象3.Date 对象总结 前言 JavaScript 语言是事件驱动型的。这意味着,该门语言可以通过事件触发来调用某一函数或者一段代码。该文还简单介绍了Window…...
Qt基础类05-尺寸类QSize
Qt基础类05-尺寸类QSize 摘要基本信息写在前面重要成员函数举例7个QSize QSize::boundedTo(const QSize &otherSize) constQSize QSize::expandedTo(const QSize &otherSize) constbool QSize::isEmpty() constbool QSize::isNull() constbool QSize::isValid() constQ…...
Vue 2中的this指向详解
在JavaScript中,this的指向是许多开发者经常遇到的问题,尤其是在使用Vue这样的框架时。在Vue 2中,理解this的指向对于正确地访问组件的数据和方法至关重要。 1. this在Vue组件中的指向 在Vue组件的选项中,this通常指向当前组件实…...
长业务事务的离线并发问题
事务指代一组操作同时成功或同时失败,事务可分为两类: 系统事务:即关系数据库事务,一次数据库连接中由start transaction或begin开启,commit表示提交,rollback表示回滚;业务事务:完…...
5步搞定Live Avatar数字人模型:阿里开源项目快速体验指南
5步搞定Live Avatar数字人模型:阿里开源项目快速体验指南 1. 数字人技术新体验 想象一下,你只需要一张照片和一段语音,就能让照片里的人"活"过来,对着镜头自然地说话、微笑、做表情。这不是科幻电影里的场景ÿ…...
如何优雅处理Fumadocs错误:打造用户友好的异常捕获与错误页面
如何优雅处理Fumadocs错误:打造用户友好的异常捕获与错误页面 【免费下载链接】fumadocs The beautiful & flexible React.js docs framework. 项目地址: https://gitcode.com/GitHub_Trending/fu/fumadocs 在开发React.js文档网站时,错误处理…...
Kandinsky-5.0-I2V-Lite-5s部署教程:Linux服务器supervisor配置+开机自启设置
Kandinsky-5.0-I2V-Lite-5s部署教程:Linux服务器supervisor配置开机自启设置 1. 环境准备与快速部署 在开始部署Kandinsky-5.0-I2V-Lite-5s之前,我们需要确保服务器环境满足以下要求: 操作系统:Ubuntu 20.04/22.04 LTS…...
Hyperf方案 分库分表实现
<?php /*** 案例标题:分库分表实现* 说明:基于用户ID取模实现分表路由,水平分片存储海量订单数据* 需要安装的包:* composer require hyperf/db-connection*/declare(strict_types1);// app/Sharding/ShardingStrategy.php…...
告别重复劳动:用快马平台集成codex,自动生成模型与api代码提升效率
作为一名经常需要开发用户管理系统的开发者,我深刻体会到重复编写基础代码的繁琐。最近在InsCode(快马)平台尝试了集成codex模型的功能,发现它能显著提升开发效率。下面分享我的实践过程: 用户数据模型生成 传统方式需要手动定义每个字段类型…...
RNN、LSTM、BiLSTM 算法学习笔记
NLP-AHU-026一、RNN1.我之前学的普通神经网络和CNN,都是一次性处理数据的,比如给一张图片,它就直接分析这张图的像素,不会管前后的关联。但现实里很多数据都是有顺序的,像咱们读课文、看视频,得结合上下文才…...
崇左本地人推荐的越南火锅店必吃榜
一、行业现象观察在崇左地区,尤其是德天瀑布、明仕田园等旅游热点区域,餐饮消费呈现出明显的游客与本地人差异。本地食客普遍关注性价比与熟悉口味,而游客则更倾向于体验边境异国风味。近年来,越南风味餐饮在景区周边逐渐发展&…...
python基于智能推荐算法的全屋定制平台网站设计_07y1pcxm
前言随着人们对家居环境品质的追求不断提高,全屋定制平台应运而生。本文介绍的基于智能推荐算法的全屋定制平台网站设计,旨在为用户提供一站式的家居定制解决方案。采用 Python 语言结合 Django 框架进行开发,以 MySQL 数据库作为数据存储核心…...
AutoGen Studio真实效果:Qwen3-4B多智能体自动完成周报生成与PPT摘要制作
AutoGen Studio真实效果:Qwen3-4B多智能体自动完成周报生成与PPT摘要制作 提示:本文所有操作均在安全合规的环境中进行,不涉及任何网络访问限制或敏感技术 1. 惊艳效果:多智能体如何自动完成周报和PPT 想象一下这样的场景&#x…...
西门子1500T插补控制从入门到精通:手把手教你配置直线与圆弧轨迹(附程序源码)
西门子1500T插补控制从入门到精通:手把手教你配置直线与圆弧轨迹(附程序源码) 在工业自动化领域,精确控制多轴协同运动一直是核心挑战。想象一下机械臂需要画一个完美的圆,或者CNC机床要切割复杂曲线——这些场景都离不…...
