Citus源码(1)分布式表行为测试
- 最近对citus的实现非常好奇,本篇对citus的行为做一些测试。
- 本篇只测行为,不分析源码。后面会继续写一系列文章分析citus源码。
环境:3节点 PG17 with citus。
SELECT citus_set_coordinator_host('127.0.0.1', 3001);
SELECT citus_add_node('127.0.0.1', 3002);
SELECT citus_add_node('127.0.0.1', 3003);
SELECT rebalance_table_shards();
SELECT * from pg_dist_node;postgres=# SELECT * from pg_dist_node;
+--------+---------+-----------+----------+----------+-------------+----------+----------+-------------+----------------+------------------+
| nodeid | groupid | nodename | nodeport | noderack | hasmetadata | isactive | noderole | nodecluster | metadatasynced | shouldhaveshards |
+--------+---------+-----------+----------+----------+-------------+----------+----------+-------------+----------------+------------------+
| 1 | 0 | 10.0.0.1 | 3002 | default | t | t | primary | default | t | f |
| 7 | 6 | 127.0.0.1 | 3002 | default | t | t | primary | default | t | t |
| 8 | 7 | 127.0.0.1 | 3003 | default | t | t | primary | default | t | t |
+--------+---------+-----------+----------+----------+-------------+----------+----------+-------------+----------------+------------------+
(3 rows)
case1:分布式表
- 注意表只能在cn建,dn建不能做create_distributed_table操作。
- dn上表能建,但cn上create_distributed_table时会报错,dn上已经有同名包。
结论:shard在dn上是暴漏在外面的,可以直接查询,和cn上查询效果一样。
CREATE TABLE events (device_id bigint,event_id bigserial,event_time timestamptz default now(),data jsonb not null,PRIMARY KEY (device_id, event_id)
);SELECT create_distributed_table('events', 'device_id');
INSERT INTO events (device_id, data) SELECT s % 100, ('{"measurement":'||random()||'}')::jsonb FROM generate_series(1,1000000) s;
- device_id = 1在3003上,device_id = 2在3002上,说明数据还是分片存储的,分片策略现在还不清楚,后面看源码。
- 无论在哪个节点上,只要查询分布式表都能生成分布式计划。应该是会统一路由到cn上。具体怎么路由的需要看源码。
postgres=# EXPLAIN ANALYZE SELECT * FROM events WHERE device_id = 1 ORDER BY event_time DESC, event_id DESC LIMIT 3;
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| QUERY PLAN |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=0 width=0) (actual time=13.756..13.758 rows=3 loops=1) |
| Task Count: 1 |
| Tuple data received from nodes: 181 bytes |
| Tasks Shown: All |
| -> Task |
| Tuple data received from node: 181 bytes |
| Node: host=127.0.0.1 port=3003 dbname=postgres |
| -> Limit (cost=1071.55..1071.56 rows=3 width=63) (actual time=11.164..11.166 rows=3 loops=1) |
| -> Sort (cost=1071.55..1096.36 rows=9925 width=63) (actual time=11.162..11.163 rows=3 loops=1) |
| Sort Key: event_time DESC, event_id DESC |
| Sort Method: top-N heapsort Memory: 26kB |
| -> Bitmap Heap Scan on events_102204 events (cost=237.21..943.27 rows=9925 width=63) (actual time=1.900..6.872 rows=10000 loops=1) |
| Recheck Cond: (device_id = 1) |
| Heap Blocks: exact=582 |
| -> Bitmap Index Scan on events_pkey_102204 (cost=0.00..234.73 rows=9925 width=0) (actual time=1.729..1.730 rows=10000 loops=1) |
| Index Cond: (device_id = 1) |
| Planning Time: 0.121 ms |
| Execution Time: 11.236 ms |
| Planning Time: 0.129 ms |
| Execution Time: 13.973 ms |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
(20 rows)postgres=# EXPLAIN ANALYZE SELECT * FROM events WHERE device_id = 2 ORDER BY event_time DESC, event_id DESC LIMIT 3;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
| QUERY PLAN |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=0 width=0) (actual time=12.512..12.514 rows=3 loops=1) |
| Task Count: 1 |
| Tuple data received from nodes: 181 bytes |
| Tasks Shown: All |
| -> Task |
| Tuple data received from node: 181 bytes |
| Node: host=127.0.0.1 port=3002 dbname=postgres |
| -> Limit (cost=842.04..842.04 rows=3 width=63) (actual time=9.843..9.846 rows=3 loops=1) |
| -> Sort (cost=842.04..867.04 rows=10000 width=63) (actual time=9.841..9.843 rows=3 loops=1) |
| Sort Key: event_time DESC, event_id DESC |
| Sort Method: top-N heapsort Memory: 26kB |
| -> Bitmap Heap Scan on events_102227 events (cost=237.79..712.79 rows=10000 width=63) (actual time=1.744..5.660 rows=10000 loops=1) |
| Recheck Cond: (device_id = 2) |
| Heap Blocks: exact=350 |
| -> Bitmap Index Scan on events_pkey_102227 (cost=0.00..235.29 rows=10000 width=0) (actual time=1.647..1.647 rows=10000 loops=1) |
| Index Cond: (device_id = 2) |
| Planning Time: 0.113 ms |
| Execution Time: 9.908 ms |
| Planning Time: 0.126 ms |
| Execution Time: 12.710 ms |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
(20 rows)
case2:分布式表 join 分布式表
CREATE TABLE events1 (device_id bigint,event_id bigserial,event_time timestamptz default now(),data jsonb not null,PRIMARY KEY (device_id, event_id)
);SELECT create_distributed_table('events1', 'device_id');
INSERT INTO events1 (device_id, data) SELECT s % 100, ('{"measurement":'||random()||'}')::jsonb FROM generate_series(1,1000000) s;
分布键join
- 并发开的很积极,in的条件全部被并行了,in几个值就能并行几个。
- 从计划上看是OK的,但执行时间上看明显不是每个worker在本地join的,要发送大量shuffle。说明citus默认分布式表的分布策略,对于不同表是不一样的。例如两个表的shard key都是device_id,但同一个device_id不一定在容一个节点上。
- Co-location表负责解决这类问题。Co-location表 = PGXC的distribute by hash表
postgres=# explain select * from events e,events1 e1 where e.device_id=e1.device_id and e.device_id in (1,2,3,4,5);
+-------------------------------------------------------------------------------------------------------------------+
| QUERY PLAN |
+-------------------------------------------------------------------------------------------------------------------+
| Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=100000 width=112) |
| Task Count: 5 |
| Tasks Shown: One of 5 |
| -> Task |
| Node: host=127.0.0.1 port=3003 dbname=postgres |
| -> Hash Join (cost=1707.29..1126727.63 rows=99645950 width=126) |
| Hash Cond: (e.device_id = e1.device_id) |
| -> Index Scan using events_pkey_102332 on events_102332 e (cost=0.29..2603.53 rows=9965 width=63) |
| Index Cond: (device_id = ANY ('{1,2,3,4,5}'::bigint[])) |
| -> Hash (cost=1082.00..1082.00 rows=50000 width=63) |
| -> Seq Scan on events1_102364 e1 (cost=0.00..1082.00 rows=50000 width=63) |
+-------------------------------------------------------------------------------------------------------------------+
非分布键join,默认不支持shuffle
postgres=# select * from events e,events1 e1 where e.device_id=e1.event_id and e.device_id in (1,2,3,4,5);
ERROR: the query contains a join that requires repartitioning
HINT: Set citus.enable_repartition_joins to on to enable repartitioning
case3:分布式表 join 本地表
- 计划能做出来一半本地计划,一半分布式计划。
- 分布式结果会做成
Function Scan on read_intermediate_result intermediate_result
节点,提供给本地计划。 - CN上或DN上都能执行,分布式计划的部分都会路由到CN上执行,无论在哪个节点上,分布式计划结果都会做成Function Scan在进行下一步处理。
在CN上执行:
postgres=# drop table localtbl;
DROP TABLE
postgres=# create table localtbl(a int, b int);
CREATE TABLE
postgres=# insert into localtbl select t.i,t.i%10 from generate_series(0, 99) t(i);
INSERT 0 100
postgres=# select * from events e, localtbl l where e.device_id = l.a and e.device_id = 1 and e.event_id=86201;
+-----------+----------+-------------------------------+--------------------------------------+---+---+
| device_id | event_id | event_time | data | a | b |
+-----------+----------+-------------------------------+--------------------------------------+---+---+
| 1 | 86201 | 2025-03-25 17:02:52.776599+08 | {"measurement": 0.39845320795492434} | 1 | 1 |
+-----------+----------+-------------------------------+--------------------------------------+---+---+
(1 row)postgres=# explain select * from events e, localtbl l where e.device_id = l.a and e.device_id = 1 and e.event_id=86201;
+---------------------------------------------------------------------------------------------------------------------+
| QUERY PLAN |
+---------------------------------------------------------------------------------------------------------------------+
| Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=0 width=0) |
| -> Distributed Subplan 89_1 |
| -> Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=0 width=0) |
| Task Count: 1 |
| Tasks Shown: All |
| -> Task |
| Node: host=127.0.0.1 port=3003 dbname=postgres |
| -> Index Scan using events_pkey_102332 on events_102332 e (cost=0.29..8.31 rows=1 width=63) |
| Index Cond: ((device_id = 1) AND (event_id = 86201)) |
| Task Count: 1 |
| Tasks Shown: All |
| -> Task |
| Node: host=localhost port=3001 dbname=postgres |
| -> Nested Loop (cost=0.00..53.36 rows=11 width=64) |
| -> Function Scan on read_intermediate_result intermediate_result (cost=0.00..15.00 rows=1 width=56) |
| Filter: ((device_id = 1) AND (event_id = 86201)) |
| -> Seq Scan on localtbl l (cost=0.00..38.25 rows=11 width=8) |
| Filter: (a = 1) |
+---------------------------------------------------------------------------------------------------------------------+
(18 rows)
在DN上执行
postgres=# create table localtbl123(a int, b int);
CREATE TABLE
postgres=# insert into localtbl123 select t.i,t.i%10 from generate_series(0, 99) t(i);
INSERT 0 100
postgres=# select * from events e, localtbl123 l where e.device_id = l.a and e.device_id = 1 and e.event_id=86201;
+-----------+----------+-------------------------------+--------------------------------------+---+---+
| device_id | event_id | event_time | data | a | b |
+-----------+----------+-------------------------------+--------------------------------------+---+---+
| 1 | 86201 | 2025-03-25 17:02:52.776599+08 | {"measurement": 0.39845320795492434} | 1 | 1 |
+-----------+----------+-------------------------------+--------------------------------------+---+---+
(1 row)postgres=# explain select * from events e, localtbl123 l where e.device_id = l.a and e.device_id = 1 and e.event_id=86201;
+---------------------------------------------------------------------------------------------------------------------+
| QUERY PLAN |
+---------------------------------------------------------------------------------------------------------------------+
| Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=0 width=0) |
| -> Distributed Subplan 45_1 |
| -> Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=0 width=0) |
| Task Count: 1 |
| Tasks Shown: All |
| -> Task |
| Node: host=127.0.0.1 port=3003 dbname=postgres |
| -> Index Scan using events_pkey_102332 on events_102332 e (cost=0.29..8.31 rows=1 width=63) |
| Index Cond: ((device_id = 1) AND (event_id = 86201)) |
| Task Count: 1 |
| Tasks Shown: All |
| -> Task |
| Node: host=localhost port=3002 dbname=postgres |
| -> Nested Loop (cost=0.00..53.36 rows=11 width=64) |
| -> Function Scan on read_intermediate_result intermediate_result (cost=0.00..15.00 rows=1 width=56) |
| Filter: ((device_id = 1) AND (event_id = 86201)) |
| -> Seq Scan on localtbl123 l (cost=0.00..38.25 rows=11 width=8) |
| Filter: (a = 1) |
+---------------------------------------------------------------------------------------------------------------------+
(18 rows)
case4:分布式colocate_with表
CREATE TABLE devices (device_id bigint primary key,device_name text,device_type_id int
);SELECT create_distributed_table('devices', 'device_id', colocate_with := 'events');INSERT INTO devices (device_id, device_name, device_type_id)
SELECT s, 'device-'||s, 55 FROM generate_series(0, 99) s;
CREATE INDEX ON devices (device_type_id);ALTER TABLE events ADD CONSTRAINT device_id_fk
FOREIGN KEY (device_id) REFERENCES devices (device_id);SELECT avg((data->>'measurement')::double precision)
FROM events JOIN devices USING (device_id)
WHERE device_type_id = 55;
结果:分布键join,执行飞快,本地join,无shuffle。
postgres=# explain SELECT avg((data->>'measurement')::double precision)
FROM events e, devices d
WHERE e.device_id=d.device_id and d.device_type_id = 55;
+---------------------------------------------------------------------------------------------------------------------+
| QUERY PLAN |
+---------------------------------------------------------------------------------------------------------------------+
| Aggregate (cost=500.00..500.02 rows=1 width=8) |
| -> Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=100000 width=16) |
| Task Count: 32 |
| Tasks Shown: One of 32 |
| -> Task |
| Node: host=127.0.0.1 port=3002 dbname=postgres |
| -> Aggregate (cost=1013.83..1013.84 rows=1 width=16) |
| -> Nested Loop (cost=237.79..813.83 rows=10000 width=39) |
| -> Seq Scan on devices_102395 d (cost=0.00..1.04 rows=1 width=8) |
| Filter: (device_type_id = 55) |
| -> Bitmap Heap Scan on events_102331 e (cost=237.79..712.79 rows=10000 width=47) |
| Recheck Cond: (device_id = d.device_id) |
| -> Bitmap Index Scan on events_pkey_102331 (cost=0.00..235.29 rows=10000 width=0) |
| Index Cond: (device_id = d.device_id) |
+---------------------------------------------------------------------------------------------------------------------+
(14 rows)Time: 8.212 ms
postgres=# SELECT avg((data->>'measurement')::double precision)
FROM events e, devices d
WHERE e.device_id=d.device_id and d.device_type_id = 55;
+-------------------+
| avg |
+-------------------+
| 0.500442721594347 |
+-------------------+
(1 row)Time: 354.369 ms
相关文章:
Citus源码(1)分布式表行为测试
最近对citus的实现非常好奇,本篇对citus的行为做一些测试。本篇只测行为,不分析源码。后面会继续写一系列文章分析citus源码。 环境:3节点 PG17 with citus。 SELECT citus_set_coordinator_host(127.0.0.1, 3001); SELECT citus_add_node(1…...
【AI测试必学】DeepSeek API 快速入门:获取 API Key 与调用 API 步骤详解
DeepSeek API 快速入门:获取 API Key 与调用 API 步骤详解 一、获取 API Key二、调用 DeepSeek API方法 1:使用 OpenAI Python SDK 调用 DeepSeek API方法 2:使用 requests 库直接发送 HTTP 请求方法 3:使用 curl 命令 相关链接 一…...
Web前端之UniApp、Taro、ReactNative和Flutter的区别
MENU 前言介绍及公司技术差异使用方法使用场景差异注意事项打包与部署差异框架应用实例结语 前言 在移动应用开发领域,跨平台框架已成为开发者的得力工具。UniApp、Taro、ReactNative和Flutter它们在Android(安卓)或iOS(苹果&…...
[leetcode]map的用法
1. 定义和初始化 定义:std::map是一个关联容器,键值对会自动根据键的值进行排序(默认是升序)。 cpp复制 map<char, int> mp; 插入元素:可以通过operator[]或insert方法插入键值对。 cpp复制 mp[a] 1; mp[b] 3…...
PHP大马的使用
BestShell/best_php_shell.php at master Kevil-hui/BestShell 这里用到的是这位师傅的大马(主要是从头开始写一个大马实在太麻烦了) 用pikachu靶场进行上传的测试 在这里传马,这个是简单的前端校验,bp抓包改后缀就好了 上传成…...
【CC2530 教程 十】CC2530 Z-Stack 协议栈
一、Z-Stack 协议栈目录结构: Z-Stack 协议栈可以从 TI 官网免费下载,下载安装完成以后,会默认在 C 盘的根目录下创建 Texas Instruments 目录,该目录下的子目录就是安装的 Z-Stack 文件,并且在该子目录下创建Accessor…...
区间端点(java)(贪心问题————区间问题)
deepseek给了一种超级简单的做法 我是真的想不到 贪心的思路是 局部最优——>全局最优 这种我是真的没有想到,这样的好处就是后面便利的时候可以通过foreach循环直接便利qu的子元素也就是对应的某一个区间, 将一个二维数组变成一维数组,每一个一维…...
定长内存池原理及实现
目录 一、池化技术 二、内存池 三、内存池主要解决的问题 四、定长内存池的实现 1.定长内存池的原理 2.框架 3.Delete实现 4.New实现 5.性能测试 五、源码 FixedMemoryPool.h test.cc 一、池化技术 所谓“池化技术”,就是程序先向系统申请过量的资源&…...
通过php连接redis数据库
如上图所示,这是去搭建一个lamp平台, 阿帕奇和php安装好之后,php直接就被安装成阿帕奇的一个功能模块。 如上图所示,这就是php作为阿帕奇的功能模块。 如上图所示,我们去正常启动redis数据库。 如上图所示,…...
3D点云的深度学习网络分类(按照作用分类)
1. 3D目标检测(Object Detection) 用于在点云中识别和定位目标,输出3D边界框(Bounding Box)。 🔹 方法类别: 单阶段(Single-stage):直接预测3D目标位置&am…...
论文解读:《Word embedding factor based multi-head attention》——基于词嵌入因子的多头注意力
原文链接:Word embedding factor based multi-head attention | Artificial Intelligence Review 多头注意力机制线性地将查询、键和值投影到不同的子空间中,允许模型从不同的角度理解输入序列,并利用输入句子序列中有关令牌之间关系的信息。…...
单片机和微控制器知识汇总——《器件手册--单片机、数字信号处理器和可编程逻辑器件》
目录 四、单片机和微控制器 4.1 单片机(MCU/MPU/SOC) 一、定义 二、主要特点 三、工作原理 四、主要类型 五、应用领域 六、选型与设计注意事项 七、发展趋势 4.2 数字信号处理器(DSP/DSC) 编辑编辑 一、定义 二、工作原理 三、结构特点 四、应用领域 五、选型与设计注…...
LeetCode hot 100 每日一题(15)——48.旋转图像
这是一道难度为中等的题目,让我们来看看题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 提示…...
Java多线程精讲:线程操作与状态转换全解析
前言 本章内容为作者结合学习与实践的总结整理,虽力求准确,但疏漏之处在所难免。若有任何疑问或建议,恳请读者朋友们不吝指正,共同完善知识体系,感激不尽! 一、认识多线程(Thread&#…...
HashMap的位操作是什么?HashSet 的 contains 方法复杂度是多少?红黑树简单讲一下?
一、HashMap 的位操作设计 HashMap 使用位运算优化哈希计算与索引定位,核心场景如下: 哈希扰动函数 计算键的哈希值时,将高16位与低16位异或: static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hash…...
GitHub开源的容器管理面板-Dpanel
dpanel Docker安装部署二进制部署 GitHub官网 一块轻量化docker可视化管理面板,由国人开发,个人觉得是比较好用的,功能都很齐全,并且可以通过修改源码,自定义前端样式等。 Docker安装部署 官网 部署环境࿱…...
vue-将组件内容导出为Word文档-docx
1. 安装依赖 首先,我们需要安装docx库,以便在前端生成Word文档。可以通过以下命令进行安装: npm install docx 2. 实现导出功能 2.1 初始化文档 使用docx库创建一个新的文档实例,并定义文档的结构和内容。我们使用Document、…...
IMX6ULL学习篇——系统学习设备树
IMX6ULL学习篇——系统学习设备树 这篇博客的目的是系统的整理一下设备树当中的一些非常基本的概念。基于之前的学习,我们已经至少掌握了字符设备的基本的框架,编写一个最简单的字符设备简单的流程。 但是我们知道,一个外设很有可能是…...
使用vector构造杨辉三角形
力扣118题: 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1…...
亮数据爬取API爬取亚马逊电商平台实战教程
前言 在当今数据驱动的商业环境中,企业需要快速、精准地获取互联网上的公开数据以支持市场分析、竞品调研和用户行为研究。然而,传统的手动网页爬取方式面临着诸多挑战:IP封锁、验证码干扰、网站结构频繁变更,以及高昂的运维成本…...
AI+金融 应用 使用DeepSeek、Qwen等大模型输入自然语言,得到通达信等行情软件公式代码,导入后使用
AI金融 应用 使用DeepSeek、Qwen等大模型输入自然语言,得到通达信等行情软件公式代码,导入后使用。不会编程,也能行情软件中实现个性化条件选股,个性化技术指标。 AIbxm低估值趋势选股策略,参考提示词: 编…...
SmolVLM2: 让视频理解能力触手可及
一句话总结: SmolVLM 现已具备更强的视觉理解能力📺 SmolVLM2 标志着视频理解技术的根本性转变——从依赖海量计算资源的巨型模型,转向可在任何设备运行的轻量级模型。我们的目标很简单: 让视频理解技术从手机到服务器都能轻松部署。 我们同步发布三种规…...
去中心化金融
什么是去中心化金融 去中心化金融(Decentralized Finance,简称 DeFi)是一种基于区块链技术构建的金融系统,旨在通过去除传统金融机构(如银行、证券公司等)作为中介,提供各种金融服务。这些服务…...
Mysql并发事务带来哪些问题?
大家好,我是锋哥。今天分享关于【Mysql并发事务带来哪些问题?】面试题。希望对大家有帮助; Mysql并发事务带来哪些问题? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中,事务并发执行时会引发一系列问题,…...
PCL 点云多平面探测
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Open3D为我们提供了一种点云多平面探测的算法,该算法使用基于鲁棒统计的方法进行平面补丁检测。该算法具体过程:首先将点云细分为更小的块(使用二分法),然后尝试为每个点云块匹配一个平面。如果平面通过了鲁棒平…...
OpenBMC:BmcWeb添加路由5 设置handler函数
对路由对象完成了权限和method的设置后,最重要的就是设置路由的处理函数: //http\routing\taggedrule.hpptemplate <typename... Args> class TaggedRule :public BaseRule,public RuleParameterTraits<TaggedRule<Args...>> {...template <typename F…...
攻破tensorflow,勇创最佳agent(2)---损失(loss) 准确率(accuracy)问题
实战播: 怎么判定一个模型好不好,你设置的值对不对? 需要再看几个值: 例如: model Sequential()for units in model_structure:model.add(Dense(units, activationrelu))model.add(Dropout(train_config.get(dropout_rate, 0.3)))model.add(Dense(1, activationsigmoid)) 他…...
括号合法题
一、括号合法题 2116. 判断一个括号字符串是否有效 //采用从左往右和从右往左遍历的贪心算法,分别保证前缀合法,后缀合法。public boolean canBeValid(String s, String locked) {int ns.length();if (n%21) return false;int num0;// 从左到右扫描&…...
C++11之深度理解lambda表达式
前言 在现代C中,Lambda表达式提供了一种简洁而强大的方式来定义匿名函数,使代码更具可读性和灵活性。自C11引入Lambda以来,它已经成为STL算法、并发编程和回调机制中的重要工具。随着C14、C17和C20的不断演进,Lambda的功能也在不断…...
字符串常量,数组和指针的不同形式
在 C 语言中,字符串 "hello" 存储在内存中是一个字符数组,它的内存布局通常如下: 1. 字符串常量区: 字符串常量(如 "hello")是存储在程序的数据段(通常称为 .data 或 .ro…...
全面讲解python的uiautomation包
在常规的模拟鼠标和键盘操作,我们一般使用pyautogui,uiautomation模块不仅能直接支持这些操作,还能通过控件定位方式直接定位到目标控件的位置,而不需要自己去获取对应坐标位置。uiautomation模块不仅支持任意坐标位置截图&#x…...
性能测试笔记
8、JMeter扩展开发 扩展组件开发的意义 输入参数协议复杂调用逻辑功能等等 开发前的工具准备 下载jdk并安装,配置环境变量下载maven,配置环境变量修改settings.xml本地仓库,远程仓库的地址Eclipse新建Maven项目编辑 pom.xml Maven常用命令…...
相对位置2d矩阵和kron运算的思考
文章目录 1. 相对位置矩阵2d2. kron运算 1. 相对位置矩阵2d 在swin-transformer中,我们会计算每个patch之间的相对位置,那么我们看到有一连串的拉伸和相减,直接贴代码: import torch import torch.nn as nntorch.set_printoptio…...
从C语言开始的C++编程生活(2)
前言 本系列文章承接C语言的学习,需要有C语言的基础才能学会哦~ 第2篇主要讲的是有关于C的缺省参数和函数重载。 C才起步,都很简单呢! 目录 前言 缺省参数 基本语法 缺省参数的作用 函数重载 基本语法 重载的作用 缺省参数 缺省参数…...
【设计模式】深入解析装饰器模式(Decorator Pattern)
深入解析装饰器模式(Decorator Pattern) 一、装饰器模式的核心概念 装饰器模式是一种结构型设计模式,用于动态地给对象添加新功能,而不改变其原始代码。 1. 为什么需要装饰器? 避免继承带来的类爆炸问题࿱…...
K8S集群新增和删除Node节点(K8s Cluster Adds and Removes Node Nodes)
实战:在已有K8S集群如何新增和删除Node节点 在Kubernetes (K8S) 集群中,Node节点是集群中的工作节点,它们运行着容器的实际实例。管理K8S集群中的Node节点,包括新增和删除节点,是一个常见且重要的操作,可以…...
2503C++,C++标准的执行
最优雅的应该是c26刚刚引入的std::execution,通过sender/receiver模型和常用的异步算法来简化调用异步逻辑,还可随时改成协程. #include <stdexec/execution.hpp> #include <exec/static_thread_pool.hpp> int main() {exec::static_thread_pool pool(3);auto sch…...
nodejs中实现一个自定义的require方法
1.前言 大家对nodejs中的require方法应该不会陌生,这个方法可以用来导入nodejs的内置模块,自定义模块,第三方模块等,使用频率非常高,那么这个方法内部是如何实现的呢?本篇文章就是从头到尾拆分实现流程,最终实现一个自定义的require方法的 2.前置操作 导入所需的nodejs内置…...
vscode/cursor中python运行路径设置 模块导入问题
vscode/cursor中python运行路径设置 ## 文件路径设置 问题描述 pycharm的项目用cursor运行,出现目录找不到 后来利用 os.getcwd(),经过打印调试发现是IDE的本身配置问题 pycharm中,os.getcwd()默认打开当前脚本所在目录 vscode/cursor中…...
Spring学习笔记05——Spring Boot的文件结构2(POJO类)
在Spring Boot项目中,将Entity、DTO、VO放在POJO子模块中是一种常见的分层设计,它们各自承担不同的职责,通过一个通俗的例子来解释它们的作用: POJO(Plain Old Java Object)是指普通的、简单的Java对象&am…...
html和css 实现元素顺时针旋转效果(椭圆形旋转轨迹)
一 实现效果 二 实现代码 我自己是用react写的。 1. react 代码如下: import React from "react"; import styles from "./index.less";export default () > {return <div className{styles.containers}><div className{styles.c…...
C# 的Lambda表达式常见用法和示例
C# 的 Lambda 表达式是一种强大的语法糖,能够极大简化代码并增强灵活性。以下是它的主要功能和应用场景,结合具体示例说明: 1. 简化委托实例化 Lambda 可以快速定义委托(如 Func、Action),无需显式…...
2024年数维杯数学建模C题天然气水合物资源量评价解题全过程论文及程序
2024年数维杯数学建模 C题 天然气水合物资源量评价 原题再现: 天然气水合物(Natural Gas Hydrate/Gas Hydrate)即可燃冰,是天然气与水在高压低温条件下形成的类冰状结晶物质,因其外观像冰,遇火即燃&#…...
Qt中10倍提升动态截屏及渲染60帧/秒
Qt中10倍提升动态截屏及渲染60帧/秒 理解模态窗口和非模态窗口 在C中,窗口的**模态(Modal)和非模态(Modeless)**显示是两种不同的对话框或窗口行为模式,主要区别体现在用户交互和程序流程控制上。以下是它…...
OpenCV 基础全方位剖析:夯实计算机视觉开发根基
在计算机视觉的广袤领域中,OpenCV 是一座极为关键的里程碑。无论是在前沿的学术研究,还是在蓬勃发展的工业界,OpenCV 凭借其强大的功能与高效的性能,为开发者提供了丰富的图像处理和计算机视觉算法,助力无数项目落地。…...
Java试题
试题: 解析 1-5: 5: 6: 7: 8: 9: 10: 11: 12: 13:...
基于 arco 的 React 和 Vue 设计系统
arco 是字节跳动出品的企业级设计系统,支持React 和 Vue。 安装模板工具 npm i -g arco-cli创建项目目录 cd someDir arco init hello-arco-pro? 请选择你希望使用的技术栈React❯ Vue? 请选择一个分类业务组件组件库Lerna Menorepo 项目❯ Arco Pro 项目看到以…...
解密细胞衰老与溶解:AbMole助力胰腺癌研究新突破
近日,一项由德国罗斯托克大学医学中心的研究团队完成的研究,在探索胰腺癌细胞衰老与溶解的复杂机制上取得了重要进展。这项研究不仅深化了我们对胰腺癌生物学特性的理解,更为未来的研究开辟了新的方向。而在这场科学探索中,AbMole…...
罗德与施瓦茨FSU8,频谱分析仪
罗德与施瓦茨FSU8频谱分析仪 R&S FSU系列频谱仪是动态范围、相位噪声、电平精度和分辨率带宽等频谱仪指标,所有这些指标也是用户设计、测量和生产下一代无线通讯元件的重要保障。出色的表现能力 频率范围:从20Hz开始,分别到3.6 GHz, 8…...
【零基础JavaScript入门 | Day7】三大交互案例深度解析|从DOM操作到组件化开发
【零基础JavaScript入门 | Day7】三大交互案例深度解析|从DOM操作到组件化开发 🌟今日知识图谱: ✅ 事件驱动编程 → 按钮交互与定时器控制 ✅ 组件化思维 → 可复用UI模块开发 ✅ 用户体验优化 → 动画与状态反馈设计 ✅ 工程化实践 → 代码…...