压缩率提升 48%,详解 Apache Doris 存储压缩优化之道|Deep Dive

深入理解Doris 的高性能和高可用原理 Doris 和 ClickHouse 都是现代的列式数据库系统,设计用于高速数据分析和实时查询处理。虽然它们在多个方面具有相似的功能,但也存在一些关键的区别,使它们在特定应用场景下的表现各有优势。Doris 的高可用性是通过一系列的设计和机制来实现的,确保即使在硬件故障或网络问题等异常情况下,系统仍能维持正常运行并保证数据的一致性和可访问性。Doris 的高性能特性主要源于其设计原理和实现方式,这些设计使其非常适合处理大规模数据仓库和实时分析任务。 阅读详情

在分析型数据库中,列式存储是压缩和查询性能的核心基础。它按列组织数据,同一列值类型一致且分布相似,为编码与压缩算法提供极高空间局部性和可预测性。当存储的值变化较小或重复频繁时,列式布局能够减少冗余存储,并提升向量化扫描的 CPU 效率。

Apache Doris 作为一款典型的列式存储引擎,可独立存储每一列数据。导入时,每列数据写入近似固定大小的数据页,经过编码和压缩处理,以实现更紧凑的存储。在 Doris 中,数据的压缩和解压均以数据页为单位,压缩算法的上下文限制在单个数据页内。因此,数据页大小、编码方式及压缩算法都直接影响最终的压缩效率和查询性能。

在接下来的章节中,我们将结合基于 ClickBench 数据集,较为直观的展示 Apache Doris 在存储压缩方面的优化思考及改进策略。 使读者了解如何通过数据页大小与分桶数调整、编码策略优化、数据排序来提升压缩效率。

一、数据集与基线结果

我们使用 ClickBench 公共数据集来进行本次测试。该数据集包含 10 个 tsv 文件,总大小约 70GB,包括网站访问日志类字段,如 URL、Referer、UserID 等。这类数据通常混合了短字符串与整数列,结构化特征明显。

在导入前先对原始数据进行文件级压缩测试,以作为基线参考:

一、数据集与基线结果.png

随后将这批数据直接导入 Doris。使用默认建表参数,建表语句可参考:https://github.com/apache/doris/blob/master/tools/clickbench-tools/sql/create-clickbench-table.sql

数据导入后,整体存储空间约为 16.08 GB。在 Doris 的列式存储下,经过默认 LZ4 压缩,已实现相较于原始文件(21.37 GB)1.33x 倍的压缩效果。但如果从一个以高压缩比著称的列式系统角度来看,这一结果仍存在进一步的优化空间。

接下来从研发角度出发,依次对压缩算法、数据页参数与编码方式、数据排序及特征等层面介绍优化及改进思路。

二、选择合适的压缩算法

Doris 默认使用 LZ4 压缩算法,因其解压速度快且 CPU 占用均衡,适合大多数查询型负载。而在重复性强或结构化明显的数据场景中,LZ4 的压缩比较低。相较之下,ZSTD 提供更高的压缩率,但会增加压缩和解压的 CPU 消耗。在使用时,可根据实际情况灵活选择。

考虑到测试数据集中大量字符串字段存在相似前缀与重复片段的特征,我们将默认的 LZ4 压缩算法调整为 ZSTD,这可以通过在建表语句中设置表属性实现:

CREATE TABLE IF NOT EXISTS hits (
    ....
)  
DUPLICATE KEY (CounterID, EventDate, UserID, EventTime, WatchID) 
DISTRIBUTED BY HASH(UserID) BUCKETS 48
PROPERTIES (
    "replication_num"="1",
    "compression"="ZSTD");

经过该调整,表空间降至 12.9GB,相比 LZ4 减少了近 20%。虽然在导入阶段 CPU 开销略有上升,但查询性能几乎不受影响,表明 ZSTD 对典型分析型查询的解压成本是可接受的。

三、调整数据页大小与分桶数

在 Doris 的列式存储中,数据压缩的基本单位是数据页。每个数据页在写入之前经过编码与压缩,页内数据的相似程度直接影响通用压缩算法的效果。数据页的大小选择影响压缩效率与查询性能的平衡:过小的页无法形成可识别的模式,而过大的页会增加读取开销和内存负担。

Doris 默认数据页大小为 64KB,适合大部分场景。然而,对于具有明显模式或高重复率的数据集,过小的页会使数据被切得太碎,通用压缩算法的效率会变差。因此,适当增大页的大小可显著提升压缩效果。更大的页可覆盖更多连续数据,聚集相似值于同一压缩上下文内,让压缩算法更充分地挖掘重复模式与统计特征。

对于测试数据集来说,我们选择将页大小从默认的 64KB 调整为 1MB,并同时将分桶数从 48 减少到 4。分桶数越多,每个桶的数据越少,页内数据的相似性降低,压缩率就会下降。通过让数据集中到更少的桶中,可以提高页内数据的相似性,从而带来更好的压缩效果。

CREATE TABLE IF NOT EXISTS hits (
    ....
) DUPLICATE KEY (CounterID, EventDate, UserID, EventTime, WatchID) 
DISTRIBUTED BY HASH(UserID) BUCKETS 4
PROPERTIES (
    "replication_num"="1",
    "compression"="ZSTD",
    "storage_page_size"="1048576");

经过测试,存储空间进一步减小到 10.71 GB。页更大、桶更少,使得压缩算法更有效去除冗余。

不过,页大小和分桶数并非越大越好。比如,在高并发查询的场景中,过大的页可能导致额外的 I/O 开销;而在分析型和离线统计类负载中,1MB 的页与较少的分桶数通常能取得最佳效果。因此,最佳取值应根据数据规模、查询模式与导入方式进行综合考虑。

四、优化编码方式

此外,数据在页内的编码方式也与列式存储压缩效果密切相关。Doris 针对不同类型的数据采用了多种编码策略:对整数默认使用 Bitshuffle 编码 + LZ4 压缩,对字符串则使用字典编码或纯二进制编码。这些编码在大多数场景中表现优异,但仍有进一步优化的空间。

01 问题定位

为明确编码方式的改进方向,我们在 Doris 中新增一个系统表:information_schema.column_data_sizes。它精确展示每一列在压缩前后的空间占用情况(压缩前 uncompressed_bytes、压缩后 compressed_bytes、原始数据 raw_data_bytes)以及根据这些数据计算出的压缩比(ratio=compressed_bytes/uncompressed_bytes)。在系统表中执行如下查询:

SELECT
    COLUMN_NAME, COLUMN_TYPE,
    sum(COMPRESSED_DATA_BYTES) AS compressed_bytes,
    sum(UNCOMPRESSED_DATA_BYTES) AS uncompressed_bytes,
    sum(RAW_DATA_BYTES) AS raw_data_bytes,
    round(sum(COMPRESSED_DATA_BYTES) * 100.0 / sum(UNCOMPRESSED_DATA_BYTES), 2) as ratio
FROM information_schema.column_data_sizes
WHERE table_id = 1761704935641
GROUP BY COLUMN_NAME, COLUMN_TYPE
ORDER BY sum(COMPRESSED_DATA_BYTES) DESC;

查询结果如下(部分节选):

+-----------------------+-------------+------------------+--------------------+----------------+--------+
| COLUMN_NAME           | COLUMN_TYPE | compressed_bytes | uncompressed_bytes | raw_data_bytes | ratio  |
+-----------------------+-------------+------------------+--------------------+----------------+--------+
| URL                   | STRING      | 1747139004       | 9404393858         | 9038895826     | 18.58  |
| Referer               | STRING      | 1552943801       | 7023847152         | 6662498316     | 22.11  |
| Title                 | STRING      | 1480554020       | 9838412581         | 9488276782     | 15.05  |
| OriginalURL           | STRING      | 810663093        | 5680006400         | 5317485214     | 14.27  |
| WatchID               | BIGINT      | 781560948        | 781560948          | 799979976      | 100.00 |
| URLHash               | BIGINT      | 760852247        | 766458338          | 799979976      | 99.27  |
| RefererHash           | BIGINT      | 743785927        | 747950617          | 799979976      | 99.44  |
| FUniqID               | BIGINT      | 389556325        | 512285220          | 799979976      | 76.04  |
| UserID                | BIGINT      | 379008085        | 495166618          | 799979976      | 76.54  |
| HID                   | INT         | 371392630        | 371392630          | 399989988      | 100.00 |
+-----------------------+-------------+------------------+--------------------+----------------+--------+

从结果可知出,字符串列(URL, Referer, Title, OriginalURL)占据了压缩后大部分空间,而部分 BIGINT 列(WatchID,URLHash,RefererHash)的压缩率几乎是 100%。这说明字符串编码方式和整数编码方式还需优化。

02 字符串编码优化

这些存储占用大的字符串列(如 URL 与 Title)的长度大多都很短,平均长度不超过百字节。在 Doris 默认的字符串编码策略中,这类数据的存储方式并不完全高效。

字符串列默认采用 字典编码 与 Plain Binary 编码 的混合策略:系统在 segment 级别范围内优先对一列数据构建字典页,将重复字符串以索引形式存储,以减少空间占用;当字典页超过设定大小上限时(默认 256KB),后续数据自动退化为 Plain Binary 格式,其布局如下:

| binary1 | binary2 | ... | offset1 (fixed uint32) | offset2 (fixed uint32) | ...

这种格式在页尾维护了一个定长的 uint32 数组,记录每个字符串在页内的偏移位置。而当短字符串量较多时,固定 4 字节的 offset 数组浪费空间。以 10 万条短字符串为例,仅 offset 数组就需要约 400 KB,这是一笔不小的开销,且压缩算法几乎无法对其有效压缩。

为了解决这一问题,我们重新设计了页内字符串的布局,将存储方式调整为 “长度 加 内容” 顺序写入:

| length1 (varuint32) | binary1 | length2 (varuint32) | binary2 | ...

这种设计省去了独立的 offset 数组,通过变长整数(varuint32)直接记录字符串长度,提高页空间利用率。同时,数据的局部性得到改善,压缩算法(如 ZSTD)可以更有效地捕捉重复模式。经过修改,字符串列的存储空间进一步下降:

+-----------------------+-------------+------------------+--------------------+----------------+--------+
| COLUMN_NAME           | COLUMN_TYPE | compressed_bytes | uncompressed_bytes | raw_data_bytes | ratio  |
+-----------------------+-------------+------------------+--------------------+----------------+--------+
| URL                   | STRING      | 1455177520       | 9057197818         | 9038895826     | 16.07  |
| Referer               | STRING      | 1331679271       | 6730874117         | 6662498316     | 19.78  |
| Title                 | STRING      | 1122300920       | 9505664009         | 9488276782     | 11.81  |
| WatchID               | BIGINT      | 800004249        | 800004249          | 799979976      | 100.00 |
| OriginalURL           | STRING      | 768372911        | 5402777190         | 5317485214     | 14.22  |
+-----------------------+-------------+------------------+--------------------+----------------+--------+

03 整数编码的优化

在进一步分析 BIGINT 列(如 WatchID、URLHash)时,我们发现其数据分布特征与普通递增或低熵数据截然不同。这些列通常是哈希值或全局唯一 ID,熵值很高,默认使用的 Bitshuffle 编码加 LZ4 压缩效果几乎为零。

基于这一发现,通过设置 integer_type_default_use_plain_encoding=false 禁用了对这些列的 Bitshuffle 编码 + LZ4 压缩,直接写入原始字节序列再通过通用压缩算法压缩。这样省去无效的 Shuffle 操作和 Padding,结合 ZSTD 压缩算法,整体空间还略有下降,写入和读取性能也有所提升。

+-----------------------+-------------+------------------+--------------------+----------------+--------+
| COLUMN_NAME           | COLUMN_TYPE | compressed_bytes | uncompressed_bytes | raw_data_bytes | ratio  |
+-----------------------+-------------+------------------+--------------------+----------------+--------+
| WatchID               | BIGINT      | 800004249        | 800004249          | 799979976      | 100.00 |
| URLHash               | BIGINT      | 348739226        | 800004249          | 799979976      | 43.59  |
| RefererHash           | BIGINT      | 295833828        | 800004249          | 799979976      | 36.98  |
| FUniqID               | BIGINT      | 169720968        | 800004249          | 799979976      | 21.22  |
| UserID                | BIGINT      | 169536965        | 800004249          | 799979976      | 21.19  |
+-----------------------+-------------+------------------+--------------------+----------------+--------+

04 优化效果

基于字符串和整数编码方式的改进,结合前面压缩算法与页参数的调整,表空间从最初的 16.08 GB 进一步降至 8.27 GB,整体压缩率较初始阶段提升约 48.6%。在此基础上,基于 ClickBench 查询集的测试结果显示,系统在热查询场景下保持了与原有版本相同的性能,而在冷查询场景下的性能提升近一倍,实现了压缩率与查询效率的双重收益。

04 优化效果.png

五、数据本身的排序与特征

数据的排序与特征也是决定压缩效率的关键因素,常被忽视。列式存储的压缩效果依赖于相邻数据的相似性,若表的数据分布或排序与列值变化方向不一致,相似性将被打散,压缩算法难以识别模式。

在实际测试中,这种排序差异的影响非常显著。以刚才测试的 ClickBench 数据为例,通过系统表 information_schema.column_data_sizes,我们发现占用空间最大的列是 URL 列,压缩后约为 1.36 GB。

SELECT
    COLUMN_NAME,COLUMN_TYPE,
    sum(COMPRESSED_DATA_BYTES) AS compressed_bytes,
    sum(UNCOMPRESSED_DATA_BYTES) as uncompressed_bytes,
    sum(RAW_DATA_BYTES) as raw_data_bytes,
    round(sum(COMPRESSED_DATA_BYTES) * 100.0 / sum(UNCOMPRESSED_DATA_BYTES), 2) as ratio
FROM information_schema.column_data_sizes
WHERE table_id=1761728747278
GROUP BY COLUMN_NAME, COLUMN_TYPE
ORDER BY sum(COMPRESSED_DATA_BYTES) desc limit 1;
+-----------------------+-------------+------------------+--------------------+----------------+--------+
| COLUMN_NAME           | COLUMN_TYPE | compressed_bytes | uncompressed_bytes | raw_data_bytes | ratio  |
+-----------------------+-------------+------------------+--------------------+----------------+--------+
| URL                   | STRING      | 1456833417       | 9144581584         | 9038895826     | 15.93  |
+-----------------------+-------------+------------------+--------------------+----------------+--------+

将该列数据导入到一个仅包含 URL 一列并按照 URL 排序的新表中:

create table t1(
`URL` varchar(8000) NOT NULL
) DUPLICATE KEY (URL)
DISTRIBUTED BY HASH(URL) BUCKETS 1
PROPERTIES ( "replication_num"="1", "storage_page_size"="1048576");
insert into t1 select URL from hits;

查看新表中该列的数据大小,为 0.72 GB:

+-------------+-------------+------------------+--------------------+----------------+-------+
| COLUMN_NAME | COLUMN_TYPE | compressed_bytes | uncompressed_bytes | raw_data_bytes | ratio |
+-------------+-------------+------------------+--------------------+----------------+-------+
| URL         | VARCHAR     | 773983002        | 9148474115         | 9038895826     | 8.46  |
+-------------+-------------+------------------+--------------------+----------------+-------+

可以看到,在仅调整了排序与数据聚集方式后,压缩后数据大小从 1.36 GB 减少到了 0.72 GB,压缩比从 15.9% 提升到 8.46%,压缩空间几乎减少了一半。这充分说明了数据的有序性与局部相似性对压缩率的决定性影响。

因此,当用户发现 Doris 的压缩率与其他系统存在差异时,除了压缩算法与参数的区别,更常见的原因在于数据排序和分布模式的不同。压缩算法的效率对数据本身的排序极为敏感,合理设计排序键、分桶列、分桶数与导入方式,往往能带来更大的收益。因此,理解数据的分布特征、控制其在物理层面的布局,是提升 Doris 存储效率的核心手段。

六、结束语

在实际场景中,实现高压缩比的数据存储充满挑战,但列式存储系统 Doris 让这一目标变得可行。经过一系列针对性优化,最终数据的存储空间从最初的 16.08 GB 降至 8.2 GB,整体压缩率提升超过 48%。这一结果并非来自某一个独立的技术点,而是多层次调整叠加的结果:压缩算法的优化、页大小与分桶参数的调整,以及对数据特征的深入理解共同作用,才让压缩效率得到显著提升。

解析大数据领域Doris的压缩算法 Apache Doris的压缩算法是其高性能的核心支柱之一,通过列式存储优化、多级压缩策略与算法工程实现,在存储成本与查询性能间取得了卓越平衡。理论基础:列式存储与压缩的内在联系,压缩算法评价指标算法原理:LZ4的极速设计、ZSTD的自适应平衡、Snappy的稳定性实现机制:Doris的Page级压缩流程,编码与压缩的协同优化实践指南:分场景压缩策略,性能监控与调优方法案例验证:基准测试与生产优化实践证明了压缩算法的价值关键结论LZ4是实时场景的最佳选择,提供极速压缩与解压。 阅读详情

相关推荐

doris通关之概念、架构篇

doris通关

u011624157的专栏 2152

Doris基本特性

Doris是一种高效、灵活和可扩展的分布式计算框架,可以用于大规模数据处理和分析。它提供了标准SQL查询语言和列式存储引擎,支持多种数据压缩算法,并且具有高可用性和分布式事务的特性。Doris提供了一种类SQL的语言,称为Palo SQL,它允许用户使用标准SQL查询语言来查询和处理数据。Palo SQL是Doris的核心组件之一,它支持常见的SQL语法,包括聚合、分组、连接和子查询等操作。以下是关于Doris的学习笔记。日志分析:Doris可以用于日志分析,支持大规模日志的存储和分析。

yangchangsheng123的博客 2380

VESC电调高级调参指南:电机校准与性能优化实战解析

本文详细解析了VESC电调的高级调参方法,包括电机校准与性能优化实战技巧。从基础参数设置到高级机械参数优化,再到动态性能调优,提供了全面的调参指南。特别针对电机类型、功率设置、电池参数配置等关键环节给出实用建议,帮助用户充分发挥VESC电调的性能潜力。

weixin_30772105的博客 196

记 doris 加载压缩文件(lzo、snappy)pr

这里要分清两个概念:lzo是压缩算法,它只管把一块大的数据压缩成一块小的数据,但是要把一个文件分成几个数据块来压缩,压缩以后怎么保存到磁盘,以便于解压缩,这些lzo是不管的,也不会做规定,于是就有了lzop,它是一个把普通文件做lzo压缩和解压的工具(可执行程序),它定义了保存lzo压缩文件的格式,可以理解lzop是保存用lzo压缩算法压缩以后的数据的一个容器(包装盒),而这个lzop也是有格式的。解压时,接受一个已压缩的数据块,解压以后的数据块,放在另一个内存地址,解压后的大小,作为参数返回。

howard_shooter的博客 1360

2月底速申!国家超算互联网免费算力全攻略|编程小白零消耗实操首测_2026-02-26

2月底速申!国家超算互联网免费算力全攻略|编程小白零消耗实操首测作为一名编程小白,我目前正在学习编译和运行 Qt 框架,也在逐步摸索开发环境的配置方法,目标是打造一款属于自己的个人效率工具。就在这时,我挖到了一个国家级硬核福利:国家超算互联网核心节点开放免费试运行!哪怕是零基础如我,也能申领到 100 卡时异构加速卡算力,关键是——2 月底前申请更稳妥,早占位早使用。

qq_58517981的博客 2098

无人机避障——4DMmvRadar三维点云坐标转换到无人机坐标系(三)

无人机避障——4DMmvRadar三维点云坐标转换到无人机坐标系(三)

weixin_45390670的博客 1869

小白都能懂:Doris基础概况

Backend模块将数据写入到对应的数据片段中,并将数据更新到内存中的数据缓冲区。每个片段包含了一部分数据,并可以在集群中的多个节点上进行复制,以提高数据的可用性和容错性。在启动过程中,系统会根据配置文件中的参数进行初始化设置,并开始监听指定的端口,等待客户端的连接。高可用性: Doris数据库的数据分片和副本机制保证了数据的可用性和容错性,即使部分节点出现故障,系统仍能正常运行。查询性能高: 列式存储可以只读取需要的列数据,减少了IO开销,并能更好地利用CPU缓存,提高查询性能。

see0see 1336

Monocle2拟时轨迹基因模块的GO富集解析

本文详细解析了如何对Monocle2拟时分析中得到的基因表达模块进行GO富集分析。通过从热图对象中提取聚类模块,并利用clusterProfiler等工具进行功能注释,将抽象的基因表达时序模式转化为可解释的生物学功能主题,如免疫应答、细胞外基质组织等,从而深入理解细胞命运转变的驱动机制。

gpt4scribbler的博客 499

Doris--分桶,压缩,副本,TTL,建表模式,压缩策略

Apache Doris是一个基于MPP架构(Massively Parallel Processing,大规模并行处理)的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于此,Apache Doris 在多维报表、即席查询、用户画像、实时大屏、日志分析、数据湖查询加速等诸多业务领域都能得到很好应用。

2301_77948840的博客 2151

【可信数据空间-部署方案】

此部署架构体现了以下几个核心原则:去中心化: 数据存储和处理完全分布在各个参与者端,运营方只提供核心的协调和信任基础设施。安全边界清晰: 通过VPC、DMZ、防火墙、K8s命名空间等技术,在每个层级都建立了严格的安全边界。高可用与弹性: 所有关键服务均以集群方式部署,避免单点故障,并能根据负载动态伸缩。云原生: 全面采用容器化和Kubernetes编排,简化部署、管理和运维复杂度。合规性: 架构设计天然满足数据驻留要求(数据留在企业本地),并为所有操作提供不可篡改的审计追踪能力。

u014716614的博客 771

散户渡劫指南:从炼气期到化神期的量化之路

经常有人问我普通人怎么学习量化交易,我就在想怎么学了量化就不是普通人了吗,可能他的意思是类比修仙,量化素人如何修炼进阶,今天就将量化学习每个阶段均对标修仙境界的核心能力与心法要诀一一介绍,助你从“交易凡人”蜕变为“量化金仙”。

木头大左的博客 1338

MySQL数据导入Doris后存储空间占用减少的原因分析

Doris对不同的数据类型提供了不同的编码方式,例如INT类型数据使用BitShuffle编码,字符串类型数据使用字典编码,而且Doris还会根据列的值的分布情况自动切换编码类型,以避免不必要的空间浪费。这会增加表空间的膨胀率。例如,使用DataX或X2Doris等工具进行数据迁移时,由于它们的并行处理和优化算法,可能会更有效地减少数据膨胀和存储空间的使用。:Doris采用了聚合模型,这意味着在插入数据时,相同的键值会被聚合,只保留聚合后的键值,从而减少了数据的冗余和存储空间的使用。类型的N表示字节长度。

学亮编程手记 988

YOLO26改进105:全网首发--使用BiFPN改进特征金字塔网络

YOLOv6 v3.0在目标检测领域实现重大突破,通过改进网络架构和训练方案显著提升性能。该版本在COCO数据集上展现出优越表现:YOLOv6-N达到37.5% AP/1187 FPS,YOLOv6-S实现45.0% AP/484 FPS,均超越同类检测器。大模型YOLOv6-M/L分别达到50.0%/52.8% AP,L6版本更创下实时检测新纪录。关键技术包括RepVGGBlock、BiFusion等新型模块,通过多分支融合和高效重参数化设计提升性能。研究团队已验证各改进模块有效性,代码已开源。

AIcurator的博客 95

doris:数据压缩

doris:数据压缩

qq_36070104的博客 1505

【制作100个unity实战之2】实现一款简单的FPS游戏

你将学到: fps武器脚本 基础瞄准功能 僵尸敌人AI 巡逻范围 攻击间 搜寻半径 追击 枪声吸引周围的僵尸 击中僵直效果

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3550

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Doris基础】Apache Doris的存储格式详解

Apache Doris(原百度Palo)是一个基于MPP架构的高性能、实时的分析型数据库,主要用于解决海量数据的实时分析问题。这些设计使得Doris能够同时支持高并发点查询和复杂分析查询,成为实时分析场景的理想选择。通过合理配置分区、分桶和索引策略,可以充分发挥Doris的存储性能,满足不同业务场景的需求。Doris的存储格式是其高性能的核心所在,它采用了列式存储、前缀索引、物化视图等多种优化技术。分区是Doris中最顶层的物理存储单元,一个表可以按照用户指定的分区规则划分为多个分区。

IT成长日记的博客 1983

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

doris压缩方法_测试实践

本文对比了Doris数据库中的多种压缩算法特性,包括无压缩、LZ4、LZ4F、LZ4HC、ZSTD、Snappy和Zlib,分析了它们在压缩比、速度等方面的差异。针对不同场景给出了推荐选择:高性能实时分析推荐LZ4/Snappy,存储效率优先推荐ZSTD/Zlib。文中还提供了一个700万行数据的ERP物料表创建示例,演示了如何指定LZ4压缩方法,并通过SQL查询展示了当前Doris库中表名和创建时间的信息。

qq_45755385的博客 442

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Apache Doris数据压缩:ZSTD+LZ4+Snappy对比

你还在为海量数据分析时的存储成本和查询速度发愁吗?Apache Doris作为高性能分布式SQL查询引擎,提供了多种数据压缩算法选择。本文将深入对比ZSTD、LZ4和Snappy三种主流压缩算法在Doris中的应用场景、性能表现及配置方法,帮你找到最佳压缩策略。 ## 压缩算法在Doris中的应用架构 Doris的压缩机制贯穿数据存储与查询全流程,主要体现在数据写入时的编码压缩和读取时的解码操...

gitblog_00538的博客 453

Apache Doris数据表设计:Doris简单使用;Doris基本概念;Doris数据模型;Doris列定义;Doris分区和分桶;Properties配置项;关于ENGINE;Doris索引

关于Doris表的类型,可以通过在 mysql-client 中执行 HELP CREATE TABLE;查看。AGGREGATE KEY 数据模型Key 列必须在所有 Value 列之前。尽量选择整型类型。因为整型类型的计算和查找效率远高于字符串。对于不同长度的整型类型的选择原则,遵循够用即可。对于 VARCHAR 和 STRING 类型的长度,遵循够用即可。表中一行数据所有列总的字节数不能超过100KB。如果数据一行非常大,建议拆分数据进行多表存储。

学亮编程手记 4149

一文介绍Doris

关于Doris,你想要的这里都有。

阳阳阳的博客 3312

doris 数据库优化

doris 存储和查询优化

独立开发,substack顶级编辑 2697

Doris stream load压缩传输数据

Doris stream load压缩传输数据 核心参数为:-H “compress_type:GZ”

wangleigiser的博客 627

Doris(原Palo)简介

写在前面: Doris 由百度大数据部研发 ,之前叫百度 Palo,2018年贡献到 Apache 社区后,更名为 Doris 。 本博客主要从业务角度(我们为什么会选择使用它,如何用)来对Doris进行简要介绍。 1、Doris简介 Doris是一个MPP的OLAP系统,以较低的成本提供在大数据集上的高性能分析和报表查询功能。 MPP (Massively Parallel Processing...

sexy_orange的博客 1万+

Doris入门(概念理解)

Doris入门 简介 Apache Doris(原Palo)支持对海量大数据进行快速分析的MPP(Massively Parallel Processing 大规模并行处理)数据库。 定位 Doris的定位是面向在线报表和分析的数据仓库系统,可以对标于商业的MPP数据仓库系统,比如Greenplum、Vertica、Teradata等。 整体架构 Doris 的整体架构分为两层。多个 FE 组成第一层,提供 FE 的横向扩展和高可用。多个 BE 组成第二层,负责数据存储于管理。 FE...

qq_35628002的博客 6442

Apache Doris (Incubating) 原理与实践

奇技指南近日,我们邀请到百度高级研发工程师李超勇前来360,分享百度开源数据库Apache Doris 的原理与实践。Apache Doris简介Doris(原百度 Pa...

360技术 1万+

Doris存储文件格式优化

Doris存储文件格式优化

qq_43688472的博客 1586
上一篇: 【深入理解 Doris Variant:如何让 JSON 查询性能追平列存,还能承载万列索引字段?|Deep Dive】
下一篇: 更高效的数据处理解决方案:基于 MinIO 部署 Apache Doris 存算分离版本实践
SelectDB技术团队
博客等级 码龄4年 2119粉丝 484原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SelectDB技术团队

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值