TiDB实践—索引加速+分布式执行框架创建索引提升70+倍

news2024/9/21 22:42:09

作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/92d348c2

背景介绍

TiDB 采用在线异步变更的方式执行 DDL 语句,从而实现 DDL 语句的执行不会阻塞其他会话中的 DML 语句。按照是否需要操作 DDL 目标对象所包括的数据来划分,DDL 语句可以划分为 逻辑 DDL 语句 和 **物理 DDL 语句。**逻辑 DDL 语句通常只修改数据库对象的元数据,不对变更对象存储的数据进行处理,例如变更表名或变更列名。物理 DDL 语句不但会修改变更对象的元数据,同时也修改变更对象所存储的用户数据,例如,为表创建索引,不仅需要变更表的定义,同时也需要做一次全表扫描以构建新增加的索引。

在 TiDB 中,物理 DDL 被称为 Reorg DDL(Reorg 即 Reorganization)。目前物理 DDL 只包含 ADD INDEX 以及有损列类型变更(例如从 INT 转成 CHAR 类型)这两种类型。物理 DDL 的特点是执行时间较长,且执行时间与表的数据量、机器配置以及业务负载有关。

为了优化 TiDB 中物理 DDL 性能,TiDB v6.3.0 支持开启 添加索引加速 功能,提升了创建索引回填过程的速度。从 v7.1.0 开始,TiDB 又引入了 分布式执行框架 ,以进一步发挥分布式架构的资源优势。该框架的目标是对基于该框架的任务进行统一调度与分布式执行,并提供整体和单个任务两个维度的资源管理能力,更好地满足用户对于资源使用的预期。

基于以上信息,使用创建索引为例,在测试环境中验证 TiDB 索引加速及分布式执行框架对物理 DDL 的性能提升情况,供读者参考。

先上结论

  1. 基于 10 亿 表创建索引,采用普通 Online DDL 方式,耗时约 12 小时 21 分钟

  2. 基于 10 亿 表创建索引,采用 Fast DDL 方式,耗时约 30 分钟,比普通 DDL 提升约 24 倍

  3. 基于 10 亿 表创建索引,采用 Fast DDL + 分布式框架

    1. 在 3 个 TiDB Server 时,耗时约 10 分钟,是 Fast DDL 性能的 3 倍,是普通 DDL 的 72 倍
    2. 在 2 个 TiDB Server 时,耗时约 14~15 分钟,是 Fast DDL 性能的 2 倍,是普通 DDL 的 48 倍
    3. 证明采用分布式框架性能基本随着 TiDB Server 个数增长呈准线性增长
创建索引方式 参数设置 平均耗时
普通 Online DDL SET GLOBAL tidb_ddl_enable_fast_reorg = OFF; 12小时21分钟
Fast DDL SET GLOBAL tidb_ddl_enable_fast_reorg = ON; SET GLOBAL tidb_enable_dist_task = OFF; 30 分钟
Fast DDL + 分布式框架 SET GLOBAL tidb_ddl_enable_fast_reorg = ON; SET GLOBAL tidb_enable_dist_task = ON; 10 分钟

参数说明

tidb_ddl_enable_fast_reorg 从 v6.3.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 类型:布尔型
  • 默认值: ON
  • 这个变量用来控制是否开启添加索引加速功能,来提升创建索引回填过程的速度。开启该变量对于数据量较大的表有一定的性能提升。
  • TiDB v7.1.0 引入了快速加索引功能的检查点机制,即使 TiDB owner 因故障重启或者切换,也能够通过自动定期保存的检查点恢复部分进度。
  • 要验证已经完成的 ADD INDEX 操作是否使用了添加索引加速功能,可以执行 ADMIN SHOW DDL JOBS 语句查看 JOB_TYPE 一列中是否含有 ingest 字样。

tidb_enable_dist_task 从 v7.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:否
  • 默认值: ON
  • 这个变量用于控制是否开启 TiDB 分布式执行框架 。开启分布式执行框架后,DDL 和 Import 等将会由集群中多个 TiDB 节点共同完成。
  • 从 TiDB v7.1.0 开始,支持分布式执行分区表的 ADD INDEX
  • 从 TiDB v7.2.0 开始,支持分布式导入任务 IMPORT INTO
  • 从 TiDB v8.1.0 开始,该变量默认开启。如果要从低版本的集群升级到 v8.1.0 或更高版本,且该集群已开启分布式执行框架,为了避免升级期间 ADD INDEX 操作可能导致数据索引不一致的问题,请在升级前关闭分布式执行框架(即将 tidb_enable_dist_task 设置为 OFF ),升级后再手动开启。
  • 该变量由 tidb_ddl_distribute_reorg 改名而来。

tidb_service_scope 从 v7.4.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:否
  • 是否受 Hint SET_VAR 控制:否
  • 类型:字符串
  • 默认值:""
  • 可选值:"" 或 background
  • 该变量是一个实例级别的变量,用于控制 TiDB 分布式执行框架 下各 TiDB 节点的服务范围。当设置 TiDB 节点的 tidb_service_scope background 时,分布式执行框架将调度该节点执行任务(如 ADD INDEX IMPORT INTO )。

环境准备

  • 节点配置(3节点 ARM 机器)
IP 配置 磁盘 基础平台
10.x.x.1 64C 128G 2.5 T ARM
10.x.x.2 64C 128G 2.5 T ARM
10.x.x.3 64C 128G 2.5 T ARM
  • 集群信息(V 7.5.1 版本,混合部署)
[tidb@host-10-x-x-1 ~]$ tiup cluster display tidb-free
tiup is checking updates for component cluster ...
Starting component `cluster`: /home/tidb/.tiup/components/cluster/v1.14.1/tiup-cluster display tidb-free
Cluster type:       tidb
Cluster name:       tidb-free
Cluster version:    v7.5.1
Deploy user:        tidb
SSH type:           builtin
Dashboard URL:      http://10.x.x.2:2379/dashboard
Grafana URL:        http://10.x.x.1:3000
ID                 Role          Host         Ports        OS/Arch        Status  Data Dir                            Deploy Dir
--                 ----          ----         -----        -------        ------  --------                            ----------
10.x.x.1:9093   alertmanager  10.x.x.1  9093/9094    linux/aarch64  Up      /data1/tidb-data/alertmanager-9093  /data1/tidb-deploy/alertmanager-9093
10.x.x.1:3000   grafana       10.x.x.1  3000         linux/aarch64  Up      -                                   /data1/tidb-deploy/grafana-3000
10.x.x.1:2379   pd            10.x.x.1  2379/2380    linux/aarch64  Up|L    /data1/tidb-data/pd-2379            /data1/tidb-deploy/pd-2379
10.x.x.2:2379   pd            10.x.x.2  2379/2380    linux/aarch64  Up|UI   /data1/tidb-data/pd-2379            /data1/tidb-deploy/pd-2379
10.x.x.3:2379   pd            10.x.x.3  2379/2380    linux/aarch64  Up      /data1/tidb-data/pd-2379            /data1/tidb-deploy/pd-2379
10.x.x.1:9095   prometheus    10.x.x.1  9095/12020   linux/aarch64  Up      /data1/tidb-data/prometheus-9095    /data1/tidb-deploy/prometheus-9095
10.x.x.1:4000   tidb          10.x.x.1  4000/10080   linux/aarch64  Up      -                                   /data1/tidb-deploy/tidb-4000
10.x.x.2:4000   tidb          10.x.x.2  4000/10080   linux/aarch64  Up      -                                   /data1/tidb-deploy/tidb-4000
10.x.x.3:4000   tidb          10.x.x.3  4000/10080   linux/aarch64  Up      -                                   /data1/tidb-deploy/tidb-4000
10.x.x.1:20160  tikv          10.x.x.1  20160/20180  linux/aarch64  Up      /data1/tidb-data/tikv-20160         /data1/tidb-deploy/tikv-20160
10.x.x.2:20160  tikv          10.x.x.2  20160/20180  linux/aarch64  Up      /data1/tidb-data/tikv-20160         /data1/tidb-deploy/tikv-20160
10.x.x.3:20160  tikv          10.x.x.3  20160/20180  linux/aarch64  Up      /data1/tidb-data/tikv-20160         /data1/tidb-deploy/tikv-20160

mysql> select version();
+--------------------+
| version()          |
+--------------------+
| 8.0.11-TiDB-v7.5.1 |
+--------------------+
1 row in set (0.00 sec)
  • 参数配置
tiup cluster show-config tidb-test

·····

server_configs:
  tidb:
    temp-dir: /data1/tidb-free-temp
  tikv:
    storage.block-cache.capacity: 10240MiB
    
·····
  • 数据准备
wget https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz
tar -zxvf 1.0.20.tar.gz
cd sysbench-1.0.20
./autogen.sh
./configure
make && make install

[root@vm172-16-201-99 /home/tidb/zcy/sysbench-1.0.20]# sysbench --version
sysbench 1.0.20


vi config
mysql-host=172.16.201.159
mysql-port=4099
mysql-user=root
mysql-password=zcy@root
mysql-db=sbtest
time=600
threads=16
report-interval=10
db-driver=mysql

sysbench --config-file=config oltp_point_select --tables=1 --table-size=1000000000 prepare

测试过程

mysql> show create table sbtest1;
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                                                                                                                                                                                   |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sbtest1 | CREATE TABLE `sbtest1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` int(11) NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=45086776 |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)


mysql> select count(*) from sbtest1;
+------------+
| count(*)   |
+------------+
| 1000000000 |
+------------+
1 row in set (1 min 30.40 sec)

测试1: Online DDL

SET GLOBAL tidb_ddl_enable_fast_reorg = OFF;
create index k_1 on sbtest1(k);
  • 测试输出:
mysql> admin show ddl jobs;
+--------+---------+-------------------------+---------------------+--------------+-----------+----------+------------+---------------------+---------------------+---------------------+--------+
| JOB_ID | DB_NAME | TABLE_NAME              | JOB_TYPE            | SCHEMA_STATE | SCHEMA_ID | TABLE_ID | ROW_COUNT  | CREATE_TIME         | START_TIME          | END_TIME            | STATE  |
+--------+---------+-------------------------+---------------------+--------------+-----------+----------+------------+---------------------+---------------------+---------------------+--------+
|    106 | sbtest  | sbtest1                 | add index /* txn */ | public       |       102 |      104 | 1000000000 | 2024-07-16 09:40:36 | 2024-07-16 09:40:36 | 2024-07-16 22:01:38 | synced |
+--------+---------+-------------------------+---------------------+--------------+-----------+----------+------------+---------------------+---------------------+---------------------+--------+
10 rows in set (0.01 sec)
  • 执行耗时:44463 秒 = 12 小时 21 分钟 3 秒
  • 资源截图:

测试2: Fast Online DDL

SET GLOBAL tidb_ddl_enable_fast_reorg = ON;
SET GLOBAL tidb_enable_dist_task = OFF; 
create index k_1 on sbtest1(k);
  • 测试输出:
mysql> admin show ddl jobs;
+--------+---------+---------------------+---------------------------+--------------+-----------+----------+------------+---------------------+---------------------+---------------------+---------------+
| JOB_ID | DB_NAME | TABLE_NAME          | JOB_TYPE                  | SCHEMA_STATE | SCHEMA_ID | TABLE_ID | ROW_COUNT  | CREATE_TIME         | START_TIME          | END_TIME            | STATE         |
+--------+---------+---------------------+---------------------------+--------------+-----------+----------+------------+---------------------+---------------------+---------------------+---------------+
|    112 | sbtest  | sbtest1             | add index /* ingest */    | public       |       102 |      104 | 1000000000 | 2024-07-16 23:37:42 | 2024-07-16 23:37:42 | 2024-07-17 00:07:52 | synced        |
+--------+---------+---------------------+---------------------------+--------------+-----------+----------+------------+---------------------+---------------------+---------------------+---------------+
10 rows in set (0.01 sec)
  • 执行耗时:1812 秒 = 30 分钟 12 秒
  • 资源截图:

测试3: 分布式执行框架 Fast Online DDL

使用 3 个 TiDB Server 测试

SET GLOBAL tidb_ddl_enable_fast_reorg = ON;
SET GLOBAL tidb_enable_dist_task = ON;

--以下可选
TiDB-server-1: SET GLOBAL tidb_service_scope = 'background';
TiDB-server-2: SET GLOBAL tidb_service_scope = 'background';
TiDB-server-3: SET GLOBAL tidb_service_scope = 'background';
等同于
SET GLOBAL tidb_service_scope = '';

create index k_1 on sbtest1(k);
  • 测试输出:
mysql> admin show ddl jobs;
+--------+---------+------------+---------------------------+--------------+-----------+----------+------------+---------------------+---------------------+---------------------+---------------+
| JOB_ID | DB_NAME | TABLE_NAME | JOB_TYPE                  | SCHEMA_STATE | SCHEMA_ID | TABLE_ID | ROW_COUNT  | CREATE_TIME         | START_TIME          | END_TIME            | STATE         |
+--------+---------+------------+---------------------------+--------------+-----------+----------+------------+---------------------+---------------------+---------------------+---------------+
|    118 | sbtest  | sbtest1    | add index /* ingest */    | public       |       102 |      104 |  671304000 | 2024-07-17 09:55:09 | 2024-07-17 09:55:09 | 2024-07-17 10:05:25 | synced        |
+--------+---------+------------+---------------------------+--------------+-----------+----------+------------+---------------------+---------------------+---------------------+---------------+
  • 执行耗时:
次数 耗时
第1次 654 秒
第2次 618 秒
第3次 591 秒
第4次 606 秒
第5次 634 秒
平均值 620 秒
  • 资源截图:

使用 2 个 TiDB Server 测试

SET GLOBAL tidb_ddl_enable_fast_reorg = ON;
SET GLOBAL tidb_enable_dist_task = ON;

TiDB-server-2: SET GLOBAL tidb_service_scope = 'background';
TiDB-server-3: SET GLOBAL tidb_service_scope = 'background';

create index k_1 on sbtest1(k);
  • 测试输出:
mysql> admin show ddl jobs;
+--------+---------+------------+------------------------+--------------+-----------+----------+-----------+---------------------+---------------------+---------------------+--------+
| JOB_ID | DB_NAME | TABLE_NAME | JOB_TYPE               | SCHEMA_STATE | SCHEMA_ID | TABLE_ID | ROW_COUNT | CREATE_TIME         | START_TIME          | END_TIME            | STATE  |
+--------+---------+------------+------------------------+--------------+-----------+----------+-----------+---------------------+---------------------+---------------------+--------+
|    126 | sbtest  | sbtest1    | add index /* ingest */ | public       |       102 |      104 | 868990050 | 2024-07-17 14:16:18 | 2024-07-17 14:16:18 | 2024-07-17 14:30:20 | synced |
  • 执行耗时:
次数 耗时
第一次 843 秒
第二次 879 秒
第三次 876 秒
第四次 816 秒
第五次 903 秒
平均值 863 秒
  • 资源截图:

参考链接

TiDB DDL 执行原理及最佳实践: https://docs.pingcap.com/zh/tidb/stable/ddl-introduction

TiDB 分布式执行框架: https://docs.pingcap.com/zh/tidb/stable/tidb-distributed-execution-framework

问题记录

  1. 使用分布式执行框架创建索引后台JOB中 ROW_COUNT 最终结果不正确
mysql> admin show ddl jobs;
+--------+---------+------------+---------------------------+--------------+-----------+----------+------------+---------------------+---------------------+---------------------+---------------+
| JOB_ID | DB_NAME | TABLE_NAME | JOB_TYPE                  | SCHEMA_STATE | SCHEMA_ID | TABLE_ID | ROW_COUNT  | CREATE_TIME         | START_TIME          | END_TIME            | STATE         |
+--------+---------+------------+---------------------------+--------------+-----------+----------+------------+---------------------+---------------------+---------------------+---------------+
|    118 | sbtest  | sbtest1    | add index /* ingest */    | public       |       102 |      104 |  671304000 | 2024-07-17 09:55:09 | 2024-07-17 09:55:09 | 2024-07-17 10:05:25 | synced        |

分析:

表记录数为 10 亿,索引创建成功后 JOB 对应的 ROW_COUNT 值不正确,产研确认是 BUG,8.0 版本已修复

手工对比表和索引数据,确认一致

mysql> select (bit_xor(concat(id, k))) from sbtest1;
+--------------------------+
| (bit_xor(concat(id, k))) |
+--------------------------+
|     14493758885395096677 |
+--------------------------+
1 row in set, 1 warning (1 min 31.97 sec)

mysql> select (bit_xor(concat(id, k))) from sbtest1 use index(primary);
+--------------------------+
| (bit_xor(concat(id, k))) |
+--------------------------+
|     14493758885395096677 |
+--------------------------+
1 row in set, 1 warning (2 min 17.95 sec)
  1. 打开 fast ddl 开关创建索引后台JOB查看仍然走普通 ddl 模式

分析:

  1. 初次分析是因为 temp-dir 定义的目录不存在
  2. 手工创建后仍然走普通 ddl 模式,重启 TiDB Server 后正常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1940975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux学习week4+5

linux学习 十四.shell编程 9.单分支多分支 基本语法: if [ 条件 ] then代码 elif [ 条件 ] then代码 fi10.case语句 基本语法: case $变量名 in "值1") 程序1(如果变量的值等于值1,则执行程序1) ;; &q…

LeetCode刷题记录(第三天)55. 跳跃游戏

题目: 55. 跳跃游戏 标签:贪心 数组 动态规划 题目信息: 思路一:动态规划 确定dp数组含义: dp[i] 第[i]个位置能否达到确定递推公式: dp[i] 能不能达到,取决于前面d[i-j],d[i-j…

Linux TFTP服务搭建及使用

1、TFTP 服务器介绍 TFTP ( Trivial File Transfer Protocol )即简单文件传输协议是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为 69 2、TFTP 文件传输的特点 tftp…

【博主推荐】HTML5实现简洁的实用的个人网站、个人主页七个页面源码

文章目录 1.设计来源1.1 个人主页界面1.2 关于我界面1.3 我的技能界面1.4 我的经验界面1.5 我的教育界面1.6 我的项目界面1.7 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:…

【MQTT(2)】开发一个客户端,ubuntu版本

基本流程如下,先生成Mosquitto的库,然后qt调用库进行开发界面。 文章目录 0 生成库1 有界面的QT版本2 无界面版本 0 生成库 下载源码:https://github.com/eclipse/mosquitto.git 编译ubuntu 版本很简单,安装官方说明直接make&am…

1分钟带你了解等保测评流程

常言道:“安全无小事,防患于未然。” 在信息化高速发展的今天,网络安全已成为国家安全的重要组成部分,等级保护(简称“等保”)测评作为网络安全防护的重要手段,对于确保信息系统安全、稳定运行…

总台数430!2023年度各省燃机台数及装机容量一览

重型燃气轮机发电作为清洁能源战略的核心,将持续被强化以推动“双碳”目标的达成。鉴于其高度复杂的设计与制造流程,它成为了国家高端制造水平的象征。近年来,在科技强国战略的推动下,我国重型燃气轮机行业正迈向自主研发、创新突…

Elasticsearch基础(五):使用Kibana Discover探索数据

文章目录 使用Kibana Discover探索数据 一、添加样例数据 二、数据筛选 三、保存搜索 使用Kibana Discover探索数据 一、添加样例数据 登录Kibana。在Kibana主页的通过添加集成开始使用区域,单击试用样例数据。 在更多添加数据的方式页面下方,单击…

AJAX复习总结

AJAX复习总结 AJAX即“Asynchronous JavaScript and XML”(异步的JavaScript与XML技术),是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。简单来说,AJAX就是让网页变得更快、更灵活的一种方法 举个例子&#xff1a…

昇思25天学习打卡营第4天 | 网络构建

在学习和实践MindSpore神经网络模型构建的过程中,我深刻理解了MindSpore中如何通过nn.Cell类来构建和管理复杂的神经网络模型。通过这次的实践,我对神经网络的基本构建和应用有了更加全面的认识,以下是我学习过程中所总结的几点心得&#xff…

一行Python代码实现数据清洗的18种方法

目录 1. 去除字符串两边空格 2. 转换数据类型 3. 大小写转换 4. 移除列表中的重复元素 5. 快速统计元素出现次数 6. 字符串分割成列表 7. 列表合并 8. 数据填充 9. 提取日期时间 10. 字符串替换 11. 快速排序 12. 提取数字 13. 空值处理(假设是列表&am…

powe bi界面认识及矩阵表基本操作 - 1

powe bi界面认识及矩阵表操作 1. 界面认识1.1 选择数据源1.2 选择相关表及点击加载1.3 表字段显示位置1.4 表属性按钮位置1.5 界面布局按钮认识 2. 矩阵表基本操作2.1 选择矩阵表2.2 创建矩阵表2.3 设置字体大小2.4 行填充:修改高度2.5 列宽:设置列的宽度…

内置华为视频终端API接口的中央控制系统

内置华为视频终端API接口的中控系统是一种高度集成化的智能控制系统,它通过将华为视频终端的控制功能集成到中控系统中,实现了对华为视频终端的远程控制和集中管理。以下是对该系统的详细介绍: 一、系统概述 该系统通过调用华为视频终端提供…

自建网站统计工具 Umami 替代 Google Analytics

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 Umami 是一款开源的网站统计工具,与 Google Analytics 相比更加的轻量,且不会收集网站用户的个人信息。同时,Umami 的仪表盘界面简洁,UI 精美,方便我们查看网站的历史统计数据。 Umami 使用方式也与 Google Ana…

2024 微信小程序 学习笔记 第二天

1. WXML 模板语法 数据绑定 事件绑定 条件渲染 列表渲染 2. WXSS 模板样式 rpx 样式导入 全局和局部样式 3. 全局配置 window tabBar 配置tabBar案例 4. 网络数据请求 Get请求 Post 请求 加载时请求 5. 案例 -本地生活(首页) 导航栏 轮播图 九宫格效果…

MySQL命令大全:以后再也不用担心忘记SQL该怎么写啦~

一、基础操作与库命令 首先来介绍一些关于MySQL基础操作的命令,以及操作数据库相关的命令,MySQL中的所有命令默认是以;分好结尾的,因此在执行时一定要记得带上分号,否则MySQL会认为你这条命令还未结束,会继续等待你的…

mathtype7.4.4产品密钥mathtype7.4破解版mathtype 7.4.10密钥

“在数学中,符号是重要的。” 这是著名数学家陈省身的名言。对于很多科研人员来说,他们常常需要使用到各种复杂的公式和符号来描述他们的研究工作。然而,很多时候,这些公式和符号并不能很好地在文档或者网页上显示出来。 MathTyp…

【论文共读】【翻译】ShuffleNet v1:一种用于移动设备的极其高效的卷积神经网络

[原文地址] https://arxiv.org/pdf/1707.01083 [翻译] 0. 摘要 我们介绍了一种计算效率极高的CNN架构,称为ShuffleNet,该架构专为计算能力非常有限的移动设备(例如,10-150 MFLOPs)而设计。新架构利用了两个新操作&am…

Fastjson解析JSON时key对应的value存在多个英文双引号解决

情景 如上图所示,经常在解析json时会出现因双引号报错的问题。 fastjson解决方案 JSONObject jsonfile JSONObject.parseObject(json, Feature.OrderedField);JSONArray jsonArray jsonfile.getJSONObject("result").getJSONArray("items");…

c++最小生成树实现

文章目录 参考文章目的c实现 参考文章 点击访问 目的 实现参考文章中的图结构&#xff0c;并计算它的最小生成树 c实现 #include<iostream> #include<vector> #include<map>class Node { public:Node(const int val) :value(val) {}int value;std::map&…