ClickHouse 25.1 版本发布说明

适配了华为的鲲鹏920 CPU的 clickhouse-25.1.4.53 版本的linux rpm安装包 clickhouse官方aarch64版本,从23.6版开始,在华为鲲鹏920的服务器上会运行不起来 这个是用 clickhouse的源码(版本号 25.1.4.53),对鲲鹏920做了适配,重新编译生成的rpm安装包。 立即下载

图片

本文字数:12318;估计阅读时间:31 分钟

作者: ClickHouse Team

本文在公众号【ClickHouseInc】首发

图片

又到了每月发布新版本的时间!

发布概要

ClickHouse 25.1 版本正式发布,本次更新带来了15项全新功能🦃、36项性能优化⛸️、77个bug修复🏕️

在本次发布中,我们优化了并行哈希连接算法,引入了二级哈希表进行加速;在表级别新增了 MinMax 索引;改进了 Merge 表;增加了自增功能……还有更多精彩更新等你探索!

新贡献者

热烈欢迎 25.1 版本的新贡献者!ClickHouse 社区的成长令人欣喜,我们始终感激每一位贡献者,正是你们的努力让 ClickHouse 变得更加出色和受欢迎。

以下是本次版本的新贡献者名单:

Artem Yurov, Gamezardashvili George, Garrett Thomas, Ivan Nesterov, Jesse Grodman, Jony Mohajan, Juan A. Pedreira, Julian Meyers, Kai Zhu, Manish Gill, Michael Anastasakis, Olli Draese, Pete Hampton, RinChanNOWWW, Sameer Tamsekar, Sante Allegrini, Sergey, Vladimir Zhirov, Yutong Xiao, heymind, jonymohajanGmail, mkalfon, ollidraese

更快的并行哈希连接算法

贡献者:Nikita Taranov

自 24.11 版本以来,并行哈希连接已成为 ClickHouse 的默认连接策略,并且它本身已经是最快的内存哈希表连接算法。但我们从未停止优化,每个版本都会通过底层优化进一步提升连接性能。

在 24.7 版本,我们优化了并行哈希连接的哈希表分配;从 24.12 版本开始,ClickHouse 能够自动判断连接查询中哪个表应用于并行哈希连接的构建阶段。而在 25.1 版本,我们进一步加快了探测阶段的执行速度。

并行哈希连接的执行流程

为了更好地理解这项优化,我们先回顾一下并行哈希连接的构建和探测阶段。下图展示了 ClickHouse 之前的并行哈希连接机制(点击放大):

图片

在 ① 构建阶段,右表的数据被拆分,并由 N 个线程并行处理,分别填充 N 个哈希表实例。N 由 max_threads 控制,本例中设为 4。每个线程执行如下循环:

1. 读取右表的下一批数据块。

2. 对每行的连接键应用 实例哈希函数(图中蓝色),取模线程数,确定目标哈希表实例。

3. 再对连接键应用 插入哈希函数(图中黄色),计算哈希表的存储键,并 ② 插入 该哈希表实例。

4. 继续处理下一批数据块。

在 ③ 探测阶段,左表数据也会被拆分,并由 N 个线程并行处理(同样受 max_threads 控制)。每个线程执行以下循环:

1. 读取左表的下一批数据块。

2. 对连接键应用与构建阶段相同的 实例哈希函数(图中蓝色),取模线程数,确定要查找的哈希表实例。

3. 计算哈希值,在选定的哈希表实例中执行 ④ 查找。

4. 如果查找成功且连接键匹配,则 ⑤ 返回 连接后的结果。

5. 继续处理下一批数据块。

并行哈希连接的构建阶段能够同时填充多个哈希表,从而比传统的非并行哈希连接更快。

传统的非并行哈希连接由于哈希表不支持并发写入,因此只能在单线程中完成插入操作,处理大表时容易成为瓶颈。而在读取阶段,哈希表支持并发查询,因此即便是非并行哈希连接,也能在探测阶段实现高效的并行读取。

相较之下,并行哈希连接的并发构建阶段会在探测阶段带来额外的开销。因为左表的输入数据块需要先拆分,再路由到相应的哈希表实例。

为此,我们对探测阶段进行了优化,使其采用 单个共享哈希表,所有处理线程可以同时访问,就像非并行哈希连接一样。这一改进消除了数据块拆分的需求,减少了额外开销,提高了整体效率。

并行哈希连接优化后的执行流程

下图展示了 ClickHouse 并行哈希连接的优化机制(点击放大):

图片

① 构建阶段 仍然是并发执行的。但是,当 max_threads 设置为 N 时,算法不再并行填充 N 个独立的哈希表实例,而是采用 N 个两级哈希表实例。这些哈希表共有 256 个桶,并由 N 个处理线程并发填充,但填充方式确保不同线程不会操作相同的桶:

  • 哈希表实例 #0 负责填充 桶 #0、桶 #N、桶 #(N * 2),…

  • 哈希表实例 #1 负责填充 桶 #1、桶 #N + 1、桶 #(N * 2 + 1),…

  • 哈希表实例 #2 负责填充 桶 #2、桶 #N + 2、桶 #(N * 2 + 2),…

  • 哈希表实例 #3 负责填充 桶 #3、桶 #N + 3、桶 #(N * 2 + 3),…

  • 依此类推…

实现这一点的关键在于,每个处理线程执行如下循环:

1. 读取右表的下一批数据块。

2. 计算 插入哈希函数(图中黄色),对 256 取模,确定目标桶编号。

3. 再对桶编号对线程数取模,以确定 目标两级哈希表实例。

4. 使用插入哈希函数的计算结果作为键,将行数据 ② 插入 到选定哈希表实例的对应桶中。

5. 继续处理下一批数据。

这种无重叠的桶填充方式使得 ③ 合并 N 个哈希表实例到一个共享的两级哈希表 变得 极为高效。合并操作仅需将已填充的桶直接移动到新的哈希表容器,无需对桶内的条目进行额外处理,因此该操作具有 常数时间复杂度。

在 ④ 探测阶段,所有 N 个处理线程可以 并行 访问这个共享的两级哈希表,与非并行哈希连接的工作方式相同。每个线程执行以下循环:

1. 读取左表的下一批数据块。

2. 计算 插入哈希函数(图中黄色),对 256 取模,确定要查找的桶编号。

3. 在选定的桶中执行 ⑤ 查找。

4. 如果查找成功且连接键匹配,则 ⑥ 返回 连接后的行。

5. 继续处理下一批数据。

值得一提的是,与之前的实现相比,现在 构建和探测阶段共用同一个哈希函数,而不再使用两个不同的哈希函数。此外,两级哈希表的设计仅引入了轻量级的取模运算,对性能影响极小。

并行哈希连接的性能提升

为了展示 新并行哈希连接 的性能提升,我们在 AWS EC2 m6i.8xlarge 实例上运行了一组测试。该实例配置为 32 vCPU 和 128 GiB RAM。

我们在 ClickHouse 24.12 版本上运行了如下查询:

SELECT
    count(c),
    version()
FROM numbers_mt(100000000) AS a
INNER JOIN
(
    SELECT
        number,
        toString(number) AS c
    FROM numbers(2000000)
) AS b ON (a.number % 10000000) = b.number
SETTINGS join_algorithm = 'parallel_hash';
   ┌─count(c)─┬─version()──┐
1. │ 20000000 │ 24.12.1.27 │
   └──────────┴────────────┘

1 row in set. Elapsed: 0.521 sec. Processed 102.00 million rows, 816.00 MB (195.83 million rows/s., 1.57 GB/s.)
Peak memory usage: 259.52 MiB.

然后在 ClickHouse 25.1 版本上运行相同的查询:

SELECT
    count(c),
    version()
FROM numbers_mt(100000000) AS a
INNER JOIN
(
    SELECT
        number,
        toString(number) AS c
    FROM numbers(2000000)
) AS b ON (a.number % 10000000) = b.number
SETTINGS join_algorithm = 'parallel_hash';
   ┌─count(c)─┬─version()─┐
1. │ 20000000 │ 25.1.3.23 │
   └──────────┴───────────┘

1 row in set. Elapsed: 0.330 sec. Processed 102.00 million rows, 816.00 MB (309.09 million rows/s., 2.47 GB/s.)
Peak memory usage: 284.96 MiB.

查询时间从 0.521 秒缩短至 0.330 秒,提升约 36.66%。

我们还在相同的机器上使用 TPC-H 数据集(规模因子 100)进行了测试。该数据集模拟了批发供应商的数据仓库,所有表的创建和数据加载均按照官方文档进行。

一个典型的查询在 ClickHouse 24.12 上执行,涉及 lineitem 和 orders 表的连接。以下是热运行结果(取三次运行中最快的一次):

SELECT
    count(),
    version()
FROM lineitem AS li
INNER JOIN orders AS o ON li.l_orderkey = o.o_orderkey
SETTINGS join_algorithm = 'parallel_hash';
   ┌───count()─┬─version()──┐
1. │ 600037902 │ 24.12.1.27 │
   └───────────┴────────────┘

1 row in set. Elapsed: 3.100 sec. Processed 750.04 million rows, 3.00 GB (241.97 million rows/s., 967.89 MB/s.)
Peak memory usage: 16.79 GiB.

然后在 ClickHouse 25.1 版本上运行相同的查询:

SELECT
    count(),
    version()
FROM lineitem AS li
INNER JOIN orders AS o ON li.l_orderkey = o.o_orderkey
SETTINGS join_algorithm = 'parallel_hash';
   ┌───count()─┬─version()─┐
1. │ 600037902 │ 25.1.3.23 │
   └───────────┴───────────┘

1 row in set. Elapsed: 2.112 sec. Processed 750.04 million rows, 3.00 GB (355.15 million rows/s., 1.42 GB/s.)
Peak memory usage: 16.19 GiB.

查询时间从 4.104 秒缩短至 3.056 秒,提升约 25.54%。

未来的版本将带来更多 Join 连接性能优化,敬请期待!

表级 MinMax 索引

贡献者:Smita Kulkarni

MinMax 索引存储了每个数据块的最小值和最大值,可用于加速查询。如果数据大致有序,该索引将非常有效;但对于完全随机的数据,效果可能不佳。

在ClickHouse 25.1 之前,MinMax 索引需要手动为每个列单独指定。但 25.1 版本引入了 add_minmax_index_for_numeric_columns 选项,使 MinMax 索引可自动应用于所有数值列。

我们以 StackOverflow 数据集(包含 5000 万条问题、回答、标签等数据)为例,来学习如何使用这一特性。首先,我们创建一个 stackoverflow 数据库:

CREATE DATABASE stackoverflow;

以下是未启用 MinMax 索引 的 CREATE TABLE 语句:

CREATE TABLE stackoverflow.posts
(
    `Id` Int32 CODEC(Delta(4), ZSTD(1)),
    `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8),
    `AcceptedAnswerId` UInt32,
    `CreationDate` DateTime64(3, 'UTC'),
    `Score` Int32,
    `ViewCount` UInt32 CODEC(Delta(4), ZSTD(1)),
    `Body` String,
    `OwnerUserId` Int32,
    `OwnerDisplayName` String,
    `LastEditorUserId` Int32,
    `LastEditorDisplayName` String,
    `LastEditDate` DateTime64(3, 'UTC') CODEC(Delta(8), ZSTD(1)),
    `LastActivityDate` DateTime64(3, 'UTC'),
    `Title` String,
    `Tags` String,
    `AnswerCount` UInt16 CODEC(Delta(2), ZSTD(1)),
    `CommentCount` UInt8,
    `FavoriteCount` UInt8,
    `ContentLicense` LowCardinality(String),
    `ParentId` String,
    `CommunityOwnedDate` DateTime64(3, 'UTC'),
    `ClosedDate` DateTime64(3, 'UTC')
)
ENGINE = MergeTree
ORDER BY (PostTypeId, toDate(CreationDate), CreationDate);

再来看启用 MinMax 索引后的 CREATE TABLE 语句:

CREATE TABLE stackoverflow.posts_min_max
(
   `Id` Int32 CODEC(Delta(4), ZSTD(1)),
   `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8),
   `AcceptedAnswerId` UInt32,
   `CreationDate` DateTime64(3, 'UTC'),
   `Score` Int32,
   `ViewCount` UInt32 CODEC(Delta(4), ZSTD(1)),
   `Body` String,
   `OwnerUserId` Int32,
   `OwnerDisplayName` String,
   `LastEditorUserId` Int32,
   `LastEditorDisplayName` String,
   `LastEditDate` DateTime64(3, 'UTC') CODEC(Delta(8), ZSTD(1)),
   `LastActivityDate` DateTime64(3, 'UTC'),
   `Title` String,
   `Tags` String,
   `AnswerCount` UInt16 CODEC(Delta(2), ZSTD(1)),
   `CommentCount` UInt8,
   `FavoriteCount` UInt8,
   `ContentLicense` LowCardinality(String),
   `ParentId` String,
   `CommunityOwnedDate` DateTime64(3, 'UTC'),
   `ClosedDate` DateTime64(3, 'UTC')
)
ENGINE = MergeTree
PRIMARY KEY (PostTypeId, toDate(CreationDate), CreationDate)
ORDER BY (PostTypeId, toDate(CreationDate), CreationDate, CommentCount)
SETTINGS add_minmax_index_for_numeric_columns=1;

在第一张表中,主键 (Primary Key) 默认与排序键 (Sorting Key) 相同。在第二张表中,我们仍然使用相同的主键,但 额外添加 CommentCount 作为排序键,以增强 MinMax 索引的效果。

这样,我们可以基于 CommentCount 进行更高效的查询,同时结合 FavoriteCount 和 AnswerCount,因为这些字段与 CommentCount 相关。

我们可以通过以下查询,检查所有数值列是否正确应用了 MinMax 索引:

SELECT name, type, granularity
FROM system.data_skipping_indices
WHERE (database = 'stackoverflow') AND (`table` = 'posts_min_max');
┌─name───────────────────────────────┬─type───┬─granularity─┐
│ auto_minmax_index_Id               │ minmax │           1 │
│ auto_minmax_index_AcceptedAnswerId │ minmax │           1 │
│ auto_minmax_index_Score            │ minmax │           1 │
│ auto_minmax_index_ViewCount        │ minmax │           1 │
│ auto_minmax_index_OwnerUserId      │ minmax │           1 │
│ auto_minmax_index_LastEditorUserId │ minmax │           1 │
│ auto_minmax_index_AnswerCount      │ minmax │           1 │
│ auto_minmax_index_CommentCount     │ minmax │           1 │
│ auto_minmax_index_FavoriteCount    │ minmax │           1 │
└────────────────────────────────────┴────────┴─────────────┘

查询结果显示 granularity 值为 1,表示 ClickHouse 已为每个数值列的每个粒度创建 MinMax 索引。

接下来,我们向 posts 表插入数据:

INSERT INTO stackoverflow.posts 
SELECT * 
FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet');

然后将 posts 表的数据导入 posts_min_max 表:

INSERT INTO stackoverflow.posts_min_max
SELECT *
FROM stackoverflow.posts;

数据就绪后,我们执行以下查询,以查找评论数超过 50 且浏览数超过 10,000 的问题:

SELECT Id, ViewCount, CommentCount
FROM stackoverflow.posts
WHERE PostTypeId = 'Question'
AND CommentCount > 50 AND ViewCount > 10000;
SELECT Id, ViewCount, CommentCount
FROM stackoverflow.posts_min_max
WHERE PostTypeId = 'Question'
AND CommentCount > 50 AND ViewCount > 10000;

以下是查询的执行结果:

┌───────Id─┬─ViewCount─┬─CommentCount─┐
│ 44796613 │     40560 │           61 │
│  3538156 │     89863 │           57 │
│ 33762339 │     12104 │           55 │
│  5797014 │     82433 │           55 │
│ 37629745 │     43433 │           89 │
│ 16209819 │     12343 │           54 │
│ 57726401 │     23950 │           51 │
│ 24203940 │     11403 │           56 │
│ 43343231 │     32926 │           51 │
│ 48729384 │     26346 │           56 │
└──────────┴───────────┴──────────────┘

MinMax 索引的查询效果

在我的笔记本电脑上,无论查询哪张表,该查询的运行时间均约为 20 毫秒。由于数据量较小,MinMax 索引的优化效果并不明显。

为了分析查询的执行情况,我们可以 使用 EXPLAIN indexes=1 查看查询执行计划。以下是 posts 表的查询计划:

┌─explain─────────────────────────────────────┐
│ Expression ((Project names + Projection))   │
│   Expression                                │
│     ReadFromMergeTree (stackoverflow.posts) │
│     Indexes:                                │
│       PrimaryKey                            │
│         Keys:                               │
│           PostTypeId                        │
│         Condition: (PostTypeId in [1, 1])   │
│         Parts: 3/4                          │
│         Granules: 3046/7552                 │
└─────────────────────────────────────────────┘

查询结果显示,主索引 (Primary Index) 将需要扫描的粒度数 (Granules) 从 7552 减少到 3046。

现在,我们来看看 posts_min_max 表的查询计划:

┌─explain─────────────────────────────────────────────┐
│ Expression ((Project names + Projection))           │
│   Expression                                        │
│     ReadFromMergeTree (stackoverflow.posts_min_max) │
│     Indexes:                                        │
│       PrimaryKey                                    │
│         Keys:                                       │
│           PostTypeId                                │
│         Condition: (PostTypeId in [1, 1])           │
│         Parts: 2/9                                  │
│         Granules: 3206/7682                         │
│       Skip                                          │
│         Name: auto_minmax_index_ViewCount           │
│         Description: minmax GRANULARITY 1           │
│         Parts: 2/2                                  │
│         Granules: 3192/3206                         │
│       Skip                                          │
│         Name: auto_minmax_index_CommentCount        │
│         Description: minmax GRANULARITY 1           │
│         Parts: 2/2                                  │
│         Granules: 82/3192                           │
└─────────────────────────────────────────────────────┘

这张表的粒度数与 posts 表略有不同,但主索引依然有效,将扫描的粒度数 从 7682 降至 3206。

不过,ViewCount 字段的 MinMax 索引作用不大,仅从 3206 降至 3192。相比之下,CommentCount 字段的 MinMax 索引更加高效,将扫描的粒度数从 3192 进一步降低至 82。

在写入二进制格式前进行确认

贡献者:Alexey Milovidov

ClickHouse 现在会在写入二进制格式之前先进行确认,避免意外输出大量数据到终端。  例如,下面的查询会将 posts 表中的所有记录以 Parquet 格式 输出:

SELECT *
FROM stackoverflow.posts
FORMAT Parquet;

运行该查询后,会出现如下提示:

The requested output format `Parquet` is binary and could produce side-effects when output directly into the terminal.
If you want to output it into a file, use the "INTO OUTFILE" modifier in the query or redirect the output of the shell command.
Do you want to output it anyway? [y/N]

“显然,我不会想把 5000 万条 Parquet 记录直接输出到终端。”所以,我会按 N,查询仍会执行,但不会输出任何内容。

列名自动缩短

贡献者:Alexey Milovidov

为了提高可读性,ClickHouse 现在在 pretty 格式 下 自动缩短列名。  例如,以下查询用于计算 StackOverflow 数据集中各列的分位数:

SELECT
    quantiles(0.5, 0.9, 0.99)(ViewCount),
    quantiles(0.5, 0.9, 0.99)(CommentCount)
FROM stackoverflow.posts;

执行后,列名将自动缩短,使表格更紧凑易读。

┌─quantiles(0.⋯)(ViewCount)─┬─quantiles(0.⋯mmentCount)─┐
│ [0,1559,22827.5500000001] │ [1,4,11]                 │
└───────────────────────────┴──────────────────────────┘

自动递增 (Auto Increment)

贡献者:Alexey Milovidov

ClickHouse 新增了 generateSerialID 函数,用于生成分布式自增 ID(存储在 Keeper 中)。  该函数支持并行和分布式环境,并且批量处理使其执行速度更快。

它接受一个名称参数,并可以这样使用:

select number, generateSerialID('MyCounter')
FROM numbers(10);
┌─number─┬─generateSeri⋯MyCounter')─┐
│      0 │                        0 │
│      1 │                        1 │
│      2 │                        2 │
│      3 │                        3 │
│      4 │                        4 │
│      5 │                        5 │
│      6 │                        6 │
│      7 │                        7 │
│      8 │                        8 │
│      9 │                        9 │
└────────┴──────────────────────────┘

如果再次执行查询,生成的序列号会从10 继续递增:

┌─number─┬─generateSeri⋯MyCounter')─┐
│      0 │                       10 │
│      1 │                       11 │
│      2 │                       12 │
│      3 │                       13 │
│      4 │                       14 │
│      5 │                       15 │
│      6 │                       16 │
│      7 │                       17 │
│      8 │                       18 │
│      9 │                       19 │
└────────┴──────────────────────────┘

此外,还可以在表模式中使用该函数,例如:

CREATE TABLE test
(
  id UInt64 DEFAULT generateSerialID('MyCounter'),
  data String
)
ORDER BY id;

然后,我们插入一些数据:

INSERT INTO test (data) 
VALUES ('Hello'), ('World');

最后查询该表:

SELECT *
FROM test;
┌─id─┬─data──┐
│ 20 │ Hello │
│ 21 │ World │
└────┴───────┘

更强大的 Merge 表

贡献者:Alexey Milovidov

ClickHouse 的 Merge 表引擎允许将多个表整合为一个逻辑表,同时,merge 表函数 也能实现相同的效果。

在25.1 版本之前,merge 表函数默认使用第一个表的结构,除非手动指定其他结构。从25.1 版本开始,列的数据类型将标准化为通用类型,或者转换为 Variant 类型,确保合并后的表可以兼容不同的数据结构。

我们通过创建两个表来看看这个特性是如何工作的:

CREATE TABLE players (
  name String, 
  team String
)
ORDER BY name;
CREATE TABLE players_new (
  name String,
  team Array(String)
)
ORDER BY name;

然后插入一些数据:

SELECT *, * APPLY(toTypeName)
FROM merge('players*')
FORMAT Vertical;

接下来,使用 merge 表函数 查询这两个表:

SELECT *, * APPLY(toTypeName)
FROM merge('players*')
FORMAT Vertical;
Row 1:
──────
name:             Player1
team:             Team1
toTypeName(name): String
toTypeName(team): Variant(Array(String), String)

Row 2:
──────
name:             Player2
team:             ['Team2','Team3']
toTypeName(name): String
toTypeName(team): Variant(Array(String), String)

2 rows in set. Elapsed: 0.001 sec.

可以看到,team 列的类型被转换为 Variant,兼容了 players 表中的 String 类型 和 players_new 表中的 Array(String) 类型。

此外,我们也可以使用 Merge 表引擎 来实现类似的效果:

CREATE TABLE players_merged
ENGINE = Merge(currentDatabase(), 'players*');

如果我们查看表结构:

DESCRIBE TABLE players_merged
SETTINGS describe_compact_output = 1;
┌─name─┬─type───────────────────────────┐
│ name │ String                         │
│ team │ Variant(Array(String), String) │
└──────┴────────────────────────────────┘

可以看到,team 列同样被转换为了 Variant 类型,确保了不同表结构的兼容性。

 征稿启示

面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com

DeepSpeed Zero3 Offload实战:从GCC版本检查到环境配置的完整避坑指南 本文是一份针对DeepSpeed Zero3 Offload部署的完整避坑指南。针对训练中常见的`AttributeError: ‘DeepSpeedCPUAdam‘ object has no attribute ‘ds_opt_adam`报错,文章深入剖析了其根源在于GCC编译器版本过低。指南提供了从系统GCC版本深度探查、安全启用高版本GCC环境,到DeepSpeed一致性安装验证的全链路实战方案,旨在帮助用户构建稳定的大模型训练环境。 阅读详情

相关推荐

编译opencv4.2时出现undefined reference to `jpeg_default_qtables‘错误的解决方案

操作系统:kylinV10 opencv版本:4.2.0 在编译opencv4.2.0的版本时,出现undefined reference to `jpeg_default_qtables’的错误提示,导致openc编译中断,不能继续编译,所以这个错误必须解决。 解决方案 查看错误的名字,根据名字分析,很有可能是当前系统中没有安装jpeg第三方库,到 http://www.ijg.org/上下载最新的源码包 jpegsrc.v9e.tar.gz,按如下顺序开始编译安装: tar -xzvf jpegsr.

jndingxin的专栏 5106

ClickHouse 24.1 版本发布说明

ClickHouse 在 2024 年的首个新版本发布来了!

ClickHouseDB的博客 2659

51单片机基础知识

前言 周末闲着无聊,以后定时更新一期关于51单片机的学习案例,以供大家平时参考使用。至于单片机,你可以理解为人的大脑,而人各项身体器官的运作需要意识给到大脑,然后大脑再驱动我们的中枢神经进行相应的动作,这里的意识可以理解为我们要写的程序,而人的器官相当于各种输出设备,例如我们以后要学的LED、电机、各种传感器等等。学好单片机能让你找到一份相对不错的工作,当然越可观的东西也是要付出相应努力的。 一、51单片机是什么? 通常我们一说到 51 单片机,指的都是兼容IntelMCS-51体系架构的一系列单片机,而

qq_43537819的博客 6904

ClickHouse版本升级

clickhouse数据库升级

sfgagasfga的博客 2413

手把手教你用C#实现TwinCAT 3 ADS通讯(附完整代码示例)

本文详细解析了如何使用C#实现TwinCAT 3 ADS通讯,包括协议核心价值、开发环境配置、变量通信实践及高级应用场景。通过完整代码示例和性能优化技巧,帮助开发者高效实现工业自动化系统中的实时数据交换,特别适合倍福(Beckhoff)平台用户。

weixin_29230901的博客 117

第8.1节 满足构网要求的功率器件与散热设计

摘要: 构网型变流器的功率器件选型与散热设计面临严苛要求,需综合考虑过载能力、暂态应力与可靠性。IGBT模块选型需重点评估电压/电流等级、损耗特性及结温波动,而SiC MOSFET虽具有高频低损耗优势,但面临栅极可靠性等挑战。散热设计需采用液冷等先进技术控制结温波动,并通过电热应力仿真和寿命预测实现可靠性优化。系统化选型流程需结合规范要求、工况谱分析和实测验证,为构网型变流器提供坚实的物理基础。

技术工作者 913

ClickHouse 版本升级

ClickHouse 版本升级

style_boy的博客 3449

1.2 机器人控制系统软硬件平台

工业机器人的软硬件平台架构是影响工业机器人性能和效率的重要因素。良好的软硬件平台架构可以帮助工业机器人更加稳定和高效地完成工作,提高生产效率。正确的软硬件配置还可以提高工业机器人的灵活性和可靠性,使其能够更好地适应不断变化的生产环境。 同时,工业机器人的软硬件平台架构还可以影响工业机器人的安全性和维护成本。如果软硬件平台架构不合适,工业机器人可能出现故障或安全隐患,需要大量的维护和维修费用。因此,选择适当的软硬件平台架构对于确保工业机器人的高效运行和长期使用是非常重要的。

Galaxy_Robot的博客 2万+

clickHouse版本升级以及切换clickhouse keeper

记录一次对clickhouse的版本升级工作,以及从zookeeper 迁移到clickhouse keeper的试验。

qq_38796051的博客 3354

secureCRT 破解方法

3、输入注册信息打开keygen.exe,点击path,选择SecureCRT的安装目录(例如D:\VanDykeSoftware\Clients)的securecrt.exe打开,继续下一步打开LicenseHelper.exe,如下。1、注册SecureCRT9.1打开keygen.exe,出现以下问题(没有关掉安全防护,一双击打开,Windows会自动识别keygen.exe为bingdu并删除)打开桌面SecureCRT,此界面不输入内容,直接点击下一步。2、存储配置文件夹(可以默认安装)

逆水行舟 1万+

【OpenClaw企业级智能体实战】第11篇:制造业设备预测性维护实战——OpenClaw+DeepSeek+Prometheus从零搭建(附完整代码)

本文聚焦制造业设备预测性维护的核心痛点,基于OpenClaw v2026.2.1、DeepSeek智能诊断、Prometheus监控等工具,拆解“设备状态监控→智能故障诊断→预测性维护”三大核心场景。从技术原理、算法构建、实操流程到完整代码实现,提供“数据采集→模型训练→智能调度→自动处置”的全链路方案。方案遵循工业安全规范,采用“只读优先、权限最小化”原则,适配中小制造企业落地需求。通过虚拟案例验证,可使设备非计划停机时间下降65%、平均修复时间缩短47%,既适合新手快速入门,也为进阶读者提供架构优化思路

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 606

clickhose版本

ClickHouse的第22个主要版本中的第7个次要版本,经过1次修订或错误修复,并具有内部构建号或修订号2484。这个版本号用于标识和跟踪ClickHouse的特定发布和构建。版本号"22.7.1.2484"表示。

qq_41081716的博客 1951

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ClickHouse 25.5 版本发布说明

ClickHouse 25.5 版本带来了 15 项新特性、23 项性能优化和 64 项缺陷修复。

ClickHouseDB的博客 1703

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ClickHouse 25.7 版本发布说明

本次ClickHouse 25.6 发布包含 27 项新功能 🌸 26 项性能优化 🍦 以及 98 个缺陷修复 🐞。

ClickHouseDB的博客 1394

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ClickHouse 25.3 版本发布说明

ClickHouse 25.3 版本正式发布,本次更新带来了18项新功能🌱、13项性能优化🐣、48个bug修复🌦️

ClickHouseDB的博客 1637

ClickHouse 25.6 版本发布说明

本次ClickHouse 25.6 发布包含 25 项新功能 🌸 32 项性能优化 🦋 以及 105 个缺陷修复 🐝。

ClickHouseDB的博客 1249

ClickHouse 25.2 版本发布说明

ClickHouse 25.2 版本正式发布,本次更新带来了12项全新功能🐣、15项性能优化🥚、72个bug修复🌷

ClickHouseDB的博客 1913

ClickHouse 25.4 版本发布说明

ClickHouse 25.4 带来了 25 项新功能 🌸 23 项性能优化 🦋 以及 58 个缺陷修复 🐝

ClickHouseDB的博客 1467

ClickHouse 25.8 版本发布说明

ClickHouse 25.8 版本共带来了 45 项新功能 🌻、47 项性能优化 🏍 和 119 个 bug 修复 🐝

ClickHouseDB的博客 1226

ClickHouse 25.10 版本发布说明

ClickHouse 25.10 版本正式上线,本次更新带来了 20 项新功能 👻、30 项性能优化 🔮 以及 103 个 Bug 修复 🎃

ClickHouseDB的博客 1159

ClickHouse 24.10 版本发布说明

本文字数:13817;估计阅读时间:35 分钟作者:ClickHouse Team本文在公众号【ClickHouseInc】首发又到了新版本发布的时间!本次ClickHouse 24.10 版本包含了🎁、🛷、🐛在本次发布中,clickhouse-local 更加实用,新增了复制和计算器模式。可刷新物化视图已达到生产就绪标准,远程文件支持缓存,表克隆操作也得到了简化。正如往常,我们热烈欢迎所有 24.9 版本中的新贡献者!

ClickHouseDB的博客 1746

ClickHouse 25.12 版本发布说明

ClickHouse 25.12 版本带来了 26 项新特性 🎄、31 项性能优化 ⛸,以及 129 个 bug 修复 ☃

ClickHouseDB的博客 940

ClickHouse 26.1 版本发布说明

ClickHouse 版本 26.1 包含 25 个新特性 🧤 43 项性能优化 🛷 176 个 bug 修复 ⛄

ClickHouseDB的博客 725

ClickHouse 23.11 版本发布说明

23.11版本新增25个新功能,实现了24项性能优化,修复了70处bug。

ClickHouseDB的博客 1436

ClickHouse 26.2 版本发布说明

ClickHouse 26.2 来了!在本文中,文本索引和 QBit 数据类型达到生产就绪状态。

ClickHouseDB的博客 635

ClickHouse 23.9 版本发布说明

我们非常兴奋地分享了23.9版本中一系列令人惊叹的功能特性。

ClickHouseDB的博客 607
上一篇: ClickHouse发起十亿JSON文档挑战,性能完胜MongoDB、ES、DuckDB和PostgreSQL等数据库
下一篇: Warehouses:解密 ClickHouse Cloud 的计算资源分离
ClickHouseDB
博客等级 码龄3年 1707粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值