https://github.com/maicius/hiredistest
测试C++ Hiredis库
https://github.com/maicius/hiredistest
Last synced: 10 days ago
JSON representation
测试C++ Hiredis库
- Host: GitHub
- URL: https://github.com/maicius/hiredistest
- Owner: Maicius
- Created: 2018-05-27T06:14:09.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2018-05-27T06:57:01.000Z (about 8 years ago)
- Last Synced: 2025-01-10T01:27:27.221Z (over 1 year ago)
- Language: C++
- Size: 53.7 KB
- Stars: 3
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 基于Redis的进程间通信——在C++里使用python的深度学习模型
- 本文主要是为进程间通信提供一种新的思路
- 博客地址:[基于Redis的进程间通信——在C++里使用python的深度学习模型](http://www.xiaomaidong.com/?p=707)
- 本想法来源于[RoboMaster](https://www.robomaster.com/zh-CN)比赛中的神符检测,神符是指一个9宫格的手写体数字(Mnist)或火焰体动态数字,需要用到机器学习或深度学习模型对数字进行识别,从检测大符到识别全部数字到发射子弹,整个过程不能超过1.5秒,全部的运算量都集中在搭载在机器小车上的miniPC,由于miniPC性能有限,且除了这个程序之外还有个非常占用资源的自动射击程序,所以整个程序使用的是C++的代码。一开始我们使用的是xgboost,在python上把模型训练完成之后,把预测代码再改写成C++。而后来发现xgboost在真实场景上的准确率较低(只有70%),于是改为了复杂的深度学习模型,准确率上几乎可以达到100%。但此时的python代码已经比较复杂,再全部改成C++已经不现实,所以开始寻找一种能实现两者间通信的方案。
### 网上已有的通信方案
- C++ 与python的混合编程方案比较多,比如使用,说实话,我没认真看,需要的自己去百度或谷歌吧
### 基于Redis的通信方案
#### 基本思路
- Redis是一种基于内存的NoSQL 数据库,所以读写速度非常快,且使用非常简单。
- 在本应用场景中,每次需要通信的数据是9张图片,每张图片是28x28像素,所以其实就是 9 x 28 x 28的矩阵
- 所以,在C++程序中进行检测和提取图像,将9张图片的像素值依次读取进来,存储进Redis,通过标志位的方式告诉python程序进行读取,完成预测之后再将结果存储进redis,并让C++程序进行调用。整个程序的活动图如下:
- 得益于redis的高效读取,在没有gpu的加速下,在mac i7 16G的配置上跑完一次读取和预测大概需要0.3秒,即使在性能较差的miniPC上,一次耗时大概在0.6秒,主要时间消耗都在预测上,连接和读取的时间几乎可以忽略不计
#### 代码实现
- C++ 使用hiredis
mac上安装方法:brew install hiredis
ubuntu安装方法:apt-get install hiredis
- demo1: 连接数据库
redisContext* connect_redis(){
redisContext *context = redisConnect("127.0.0.1", 6379);
if(context->err) {
redisFree(context);
printf("connect redisServer err:%s\n", context->errstr);
return NULL;
}
printf("connect redisServer success\n");
return context;
}
- demo2: 测试redis lrange 操作
void test_redis_lrange(redisContext *context){
redisReply *result = (redisReply *)redisCommand(context, "lrange IMAGE_NAME_LIST 0 -1");
redisReply **elements = result->element;
size_t size = result->elements;
for(int i=0; i < size; i++){
string re = elements[i]->str;
int r = re.at(7) - 48;
cout << "r:" << r<