用CPU压缩换存储空间:数据压缩与重删实战指南

1. 先说结论:这条赛道,属于会算账的人

最近两年大家都在冲大模型、冲训练集群,显卡成了硬通货。我身边不少人一聊到性能优化,第一反应就是“加卡”“上线更大显存”。但是很少有人认真算过一笔账:你的数据真的需要那么多“算力”来保底吗?换个角度,用一点点CPU去换几十倍的存储空间,往往比买任何新硬件都划算。

我之前接手过一块日志和备份数据积压得厉害的业务,存储账单每个月都在往上涨。一开始团队的想法很简单,上更高配的存储节点、加缓存、扩容。但冷静下来拆了一遍之后发现,真正的问题在于数据存得太“原始”了。同样的数据,换一种编码、换一下切分方式、加一层去重,体积直接掉了一个数量级。整个过程没有碰过任何显卡,纯粹靠CPU压缩、精心选择压缩算法、做重复数据删除,就把存储成本打下来了。

如果你在看这篇文章,大概率也是这么个处境:存储账单越来越离谱,但又不想、也没必要在“显卡”上卷。那么这篇内容会很适合你。我会把“用少量计算节省巨量存储”这件事拆开,讲清楚底层原理、工具选型、参数怎么定,以及我实操中踩过的那些坑。目标只有一个:让你看完能直接在自己的业务里动手试一轮。

2. 核心思路:先把“压缩”这件事彻底搞明白

2.1 计算和存储之间的本质置换关系

先说一个最底层的逻辑:任何数据都存在冗余。图片里有肉眼察觉不到的细节残留,日志里大量重复的字段,数据库里相邻记录之间的相似性,备份文件里几天之间几乎没变的部分,这些都是可以“算掉”的冗余。存储要做的就是把这些数据原封不动放着,而计算的角色则是想办法把冗余识别出来、去掉,等真正要用的时候再还原回来。

这就形成了一条清晰的置换链路:CPU花时间去处理数据 → 减少文件体积 → 降低存储成本 → 读取时再花CPU还原。对于冷数据、备份数据这类“写入多、读取少”的典型场景,这个置换几乎是稳赚不赔的。一台普通的服务器,几百个CPU核心,用其中几个核去跑压缩任务,一天能处理几个TB的数据,而省下的存储空间可能是几百GB甚至几个TB。

我第一次意识到这件事的力量,是有一次要归档一份接近3TB的数据库历史快照。在不改变任何业务逻辑的前提下,用稍高一点的压缩级别跑了一遍,体积直接压到700GB。算下来节省的存储成本,足够买那台做压缩的机器好几年。那一刻我才想通:显卡是给模型训练用的加速器,而存储优化这门生意,拼的是对数据特征的判断力。

2.2 压缩算法选型:不是越大的压缩率越好

市面上的通用压缩算法多到你选不过来,但真正经得起生产环境考验的,其实就那么几个:LZ4、Snappy、Zstd、Brotli,另外还有老牌的Zlib和Gzip。我最近两三年用得最多的是Zstd,其次是LZ4。为什么是这两个?因为它们在“压缩速度”和“压缩率”之间给出了很宽的选择范围,而且生态足够好,Java、Go、Python、C++都有各自的语言实现。

选算法时要先想清楚数据的访问模式。如果数据是线上服务要实时读的,比如缓存、索引、热日志,那就绝对不能上重压缩,延迟会把你坑死,选LZ4这类以速度见长的算法更稳。如果数据是归档、备份、历史快照,半年都不会被读一次,那就可以毫无心理负担地拉高压缩级别,哪怕多花几倍的CPU时间——反正它也不影响线上体验。

我见过很多人的误区:拿到数据就无脑选最大压缩率,觉得“存得越小越好”。其实这是错的。压缩率提升到一定程度之后,边际收益急剧下降,CPU开销却成倍增长。以Zstd为例,默认级别(3)到级别(9),压缩率可能只提升5%到8%,但CPU耗时可能翻了一倍不止;而从级别(9)到级别(19),压缩率往往也就再提升几个点,CPU耗时却可能涨了五倍。生产环境最怕这种“为了省一点磁盘,把CPU资源打满”的方案。

2.3 真正被低估的神器:字典压缩和预设词典

通用压缩再优化也有天花板,真正让“计算换存储”产生质变的,是针对数据特征做预设词典(Dictionary)的压缩。这个技术可以一句话概括:把数据里经常出现的长字符串抽出来,编成一本“小词典”,压缩时遇到重复片段就直接换成词典里的编号。

我举一个特别典型的例子,某系统的日志文本,每行都包含相同的服务器ID、接口路径前缀、状态码枚举值。直接丢给Zstd,可以压缩6倍左右,但如果我们先花点时间从样本数据里提取出一本包含2000个高频字符串的词典,再配合Zstd训练模式,压缩率能比无词典提升两倍以上。整个操作无非是先扫描一段有代表性的数据,算出一份词典文件,之后所有同类数据都用这份词典去压。

这台计算开销几乎可以忽略不计,但换来的存储收益非常可观。很多云厂商的日志服务、监控系统在底层都用了类似的思路,只是他们不告诉你。你再看到别人说“我们压缩率能做到20比1”的时候,别觉得人家吹牛——他们大概率不是用了什么神秘的超级算法,而是针对数据特征定制了词典和编码方式。

3. 比“压缩”更狠的:结构化编码与分层存储

3.1 列式存储、字典编码和增量编码的组合拳

通用压缩算法只把数据当成一串“字节流”去处理,但如果你能理解数据的结构,优化的空间会立刻大一个量级。结构化数据里有大量的重复值,比如订单状态字段就那么几个值:待支付、已支付、已发货、已完成、已取消。如果按行式存储,每个订单都要把这几个字写一遍;但如果按列式存储,状态这一整列的值全部聚合在一起,直接做字典编码(把每个唯一值映射成一个整数)加位图压缩(Bitmap Index)或者游程编码(RLE),那这一列的存储开销几乎可以忽略不计。

放在普通用户的视角,这就像你整理书架。如果不分类,所有书按原始大小摆着,书架很快就满了;但如果你把同类型的书归到一起,只记录不同类型各占多少本,书架就被解放出来了。列式存储做的事情本质上就是“把重复的东西聚合到一起,再一次性榨干它”。

这套逻辑不只是数据仓库的专利。我自己在存时间序列指标数据时,也用了类似的办法:对不同指标的序列做增量编码(Delta Encoding),然后对整段增量的绝对值做Varint变长编码,实测下来体积比原始JSON格式小了10倍以上,且压缩耗时远比重新设计一个专用算法要低。这类基于结构感知的编码技巧,才是“少量计算”的最佳体现——CPU开销很低,完全不需要GPU,只是改变了数据组织方式,存储就已经大幅下降。

3.2 冷热分层不是概念,是实实在在的账单削减

还有一件事大家每天都在提,但真正落地的并不多:冷热数据分层。很多团队的做法是“要么全放高性能盘,要么全丢对象存储”,但更合理的做法是让数据自己“流动”起来。热数据,比如最近3天的业务读写,放在延迟最低、成本最高的存储上;温数据,比如最近一个月内偶尔还要查询的,放到压缩过的中等成本存储上;冷数据,比如一年前的日志、历史订单快照,压缩好丢到低成本对象存储里,读写频率低到可以忽略。

我在之前的项目中做过一次存储账本分析,发现账单里接近70%的成本来自“长期没人读”的数据。这些数据如果继续留在原来的存储上,等于你用热存储的价格在“养”一堆无用的影子。后来我写了一套简单的生命周期策略:超过30天的数据自动转冷并压缩,超过180天的数据再转归档层。整个过程不增加任何一个新硬件,仅靠调度任务和压缩算法的配合,账单直接降到了之前的35%左右。

这里面有一个落地细节特别值得说:转冷压缩时要考虑“一次性成本”和“长期收益”的平衡点。如果数据自身压缩率不高(已经是图片、音视频这类高熵文件),那转冷时再做压缩就是白费CPU。所以在制定分层策略之前,我建议先抽样跑一次压缩率测试,把每类数据的“可压缩空间”摸清楚,再决定要不要压、压到什么程度。

3.3 小文件合并:被绝大多数人忽略的元数据黑洞

还有一个惨痛教训我得分享:小文件的存储开销比想象中大得多。文件系统保存文件时,除了文件内容本身,还要记录文件路径、权限、修改时间、扩展属性等元数据。你存10万个1KB的小文件,真实消耗往往比那10MB数据本身要贵得多,因为小文件挤占了大量的索引和数据块。

我在某次归档任务里就吃过这个亏,搞了一个分区导出的任务,结果吐出来上百万个几十KB的碎片文件。直接把这些文件传上归档存储,成本惊人。后来改成先做本地合并:把一批小文件拼成几个GB级别的容器格式(相当于打包成大文件),再对合并后的文件做压缩。这个看似简单的操作,让存储用量直接降掉了将近80%,而且后续读取时由于顺序IO增多,整体拉取速度反而更快了。

大文件的原理其实跟“集装箱化”很像。散货一个个扛上船,码头一片混乱;装进标准集装箱之后,装卸效率、船上空间利用率都大幅提升。数据也是一样,小文件合并后再压缩,是把每一次寻址和编码的开销摊薄到了大数据块上,这笔账无论怎么算都划算。

4. 不限量的大招:重复数据删除与基于内容寻址的存储

4.1 备份场景为什么压缩率总是能“超神”

你可能听过某些存储厂商吹“我们备份压缩率20:1甚至50:1”,听起来离谱得很。但实际上这种压缩率并不是在骗人,而是因为他们做了重复数据删除(重删,Deduplication),并且做了全局级的重复检查,而不只是单文件级别的压缩。

备份和归档数据天然存在大量跨时间片段的重复内容。举个例子,今天凌晨2点你给数据库做了一次全量备份,明天凌晨2点又做了一次。两个备份之间绝大多数数据块是相同的,如果存储系统可以把每个数据块切出来算一个哈希指纹,发现“哎,这个块之前存过了”,那就完全不需要重新保存,只要在索引里新增一条引用记录就好。整个过程消耗的CPU,只是为了把数据切块、计算哈希、查索引,远比重写一遍数据便宜得多。

这样的去重机制在面对“多份相似数据”时价值非常大。数据越多、越相似,去重收益越高。几年前我参与做一个模拟数据备份方案的调研时,做过一次全量+增量的比对,发现跨版本的重复率可以达到85%以上,也就是说只做这一件事,就把原本要存5份的备份量压成了1份多。

4.2 可变长度切块:去重的灵魂

重删里有一个细节,是很多没做过底层存储的人容易忽略的,它决定了去重率的上限:数据切块方式。如果把数据按固定大小(比如4KB)切成块,那么只要文件中间插入了几百个字节,后面的所有块边界都会错位,导致大量本可重用的数据块因为“对不上指纹”而无法去重。这就是所谓固定分块的“边界漂移”问题。

解决这个问题的主流方案是可变长度内容定义分块(CDC,Content-Defined Chunking),核心思路是用滑动窗口,加上一个基于内容计算出来的切分条件来判定边界,比如“当前窗口哈希值的最低N位等于某个预设值,就把这里当作块边界”。这样一来,只要块内容保持不变,哪怕文件开头增删了数据,后面的切分点也能自动对齐,去重率能得到质的提升。

我当时第一次部署这套方案时,用的是软件层面的实现,没有依赖任何专用硬件,就是让普通服务器在一堆历史快照上算滚动哈希。切块+重删+压缩一套流程下来,CPU峰值也就占了几个核,但整体存储用量降到了原来的20%以下。那之后我再看到有公司为了省点存储疯狂扩节点,我都想把这份重删方案直接拍在他们桌上。

4.3 重删之后再压缩:顺序有讲究

还有一个经验之谈是:去重和压缩的先后顺序很重要。正确的方式通常先去重、再压缩。因为去重处理的是“跨数据块”的大面积重复,压缩处理的是“块内部”的小尺度冗余。如果先压缩再切块去重,因为压缩算法会破坏数据块边界的对齐性,反而可能降低后续去重的命中率。先切块去重,把重复数据消解掉,再对剩下的唯一数据块做压缩,整体效果最好。

这个顺序也影响了我在重删缓存设计中的选择:整个流程设计成了“数据进入 → 滑动窗口切块 → 算哈希 → 查指纹库 → 命中的只存引用 → 未命中的块进入压缩器 → 压缩后落盘”。每一步都是上一层的“精加工”,一级比一级处理得更细,最终的数据冗余被层层榨干。

5. 实操复盘:一个数据平台的改造全过程

5.1 第一步:摸底和采样,别当无头苍蝇

这部分我尽量写细一点,方便你照着做。完整改造的第一步是摸底,而不是急着上工具。先整理出目前存储池里有哪些数据目录,分别属于哪个业务,最近30天有没有被访问。命令无非就是扫描文件列表、按类型统计大小分布、抽样读取文件内容并测试可压缩性。

抽样测试这一步很多人会图省事直接跳过,但它的价值巨大。我会在每个数据类别里随机挑几份样本文件,分别用LZ4、Zstd(默认级别)、Zstd(最高级别)跑一轮压缩率对比,同时记录压缩耗时。整理出来的表格大概是这样:

数据类别原始大小LZ4压缩率Zstd默认压缩率Zstd高等级压缩率推荐方案
业务数据库备份2.4TB2.8x5.1x6.2xZstd默认即可
应用程序日志900GB3.1x6.8x8.5xZstd+词典压缩
图片缩略图/素材700GB1.2x1.3x1.4x不压缩,直接转冷
历史报表导出350GB4.2x9.8x13.7xZstd高等级一次压缩长期存储

有了这个摸底结果,后续所有决策都有依据了,不会再凭感觉乱压。这块数据我在任何项目里都会保留一份完整清单,因为它同时还是后续做容量规划和成本预测的基础。

5.2 第二步:写入侧改造与压缩策略落地

摸完底之后,要开始动写入链路。核心思路是在数据生成方就近做第一轮压缩,而不是等落盘之后再去“抢救”。因为数据在源头压缩之后,后续无论是传输、落盘还是备份,享受的都是压缩后的体积红利,相当于整条流水线都被“变小”了。

我实际改动的方案是:日志系统在写文件前先经过一个队列,由几个常驻进程用Zstd做实时压缩,压缩后的数据才落盘;数据库备份脚本则改为“备份即压缩”,备份文件生成后直接走一遍高等级压缩再传到备份存储。这里要特别留意的一点是:压缩任务一定要做CPU限制,不能挤占业务高峰期的资源。我在调度器里给压缩任务加了“队列权值”,当业务高峰期CPU使用率突破70%时,压缩任务自动降速;到深夜空闲时,再把压缩优先级拉到最高。这样既不影响白天业务,又能把深夜的闲置计算变成存储空间。

5.3 第三步:重删、分层和生命周期策略

第三步是加入重删模块和切换生命周期策略。备份文件这一路,我在存储服务里挂了一个轻量的重删插件,它会自动把备份文件切成内容相关的数据块,指纹入库。第一次全量备份之后,后续的备份和新备份里重复的块全部命中,只有增量部分会被真正写入。

同时我把生命周期策略分成三个档位:3天内的高频访问数据,保留在本地高性能存储上,不压缩或LZ4快速压缩;3到30天的数据,转成Zstd压缩后放温存储层;超过30天的数据,再压一次归档级压缩并转移到低成本存储。这套流程自动化执行之后,基本就不需要人工干预了。最终效果是整个存储账单下降到了改造前的三分之一,最极端的数据集(日志)压到了原始体积的十分之一以下。而所有这些收益,只付出了几个CPU核的常驻开销。

6. 常见问题和坑:别人踩过的,你尽量别再踩

6.1 压缩率“看起来”很低的文件,问题往往不在算法

我经常收到提问:“为什么我的XX数据压缩率只有1.5倍?”排查下来大部分原因是数据本身已经是高熵内容,比如图片、视频、加密字段和随机数。这类数据没有冗余可压,你再换算法也没用。判断方法很简单:提前做一轮“熵值估算”或者抽样压测,如果压缩率很低,说明这条路已经走到头了,此时的重点应该是数据生命周期管理和转冷策略,而不是继续压。

6.2 大量随机读取场景,遇到压缩数据就变慢

压缩之所以能省存储,不是没有代价的。最典型的问题就是随机读取时的解压开销。假设你压缩了一个500GB的文件,解压整个文件也就几秒到几十秒,但用户可能在文件随机位置查一个记录,你不得不把包含那块数据的整个压缩块读出来并解压。

这个问题的解法通常是把数据切分成相对较小的压缩块,比如每条/每批次数据单独一个压缩单元,并对压缩块维护索引。展开来讲就是“按小分片压缩、按分片索引定位”,这样随机读的时候只需解压目标分片,而不是整个文件。日志检索类的查询延迟通常能控制在几十毫秒内,完全不影响体验。

6.3 压缩数据的损坏风险与校验策略

压缩数据比原始明文数据更“娇贵”。原始文本时就算文件有局部位错,可能只是显示乱码;但压缩后的文件任何一个字节被破坏,都有可能导致整块解压失败,数据全毁。所以对重要数据做压缩存储时,一定要保留校验值,比如压完后记录每个分片的CRC或哈希值,再定期做巡检比对。

有一次我就在巡检里发现一批历史归档文件的校验值对不上了,最后追查发现是底层存储介质出现了静默数据损坏。如果没有校验机制,这些文件可能要等到真要去取的时候才会被发现,那时候可能已经没有原始数据可以恢复了。

6.4 重删命中率低的三种常见原因

  • 切块粒度太大或太小。粒度过大导致重复碎片被混进大块里,粒度过小又会让指纹库膨胀、内存占用飙升,需要结合数据类型反复调。
  • 没有做CDC切块,用的还是固定切块,边界漂移严重。
  • 全局指纹库只做了单节点索引,没做跨节点共享,导致同一数据在不同节点上各存了一份,重删收益直接打折。

6.5 监控指标,我始终在盯的四件事

做存储优化最怕的就是“压过头”,省钱省出事。我自己的监控大盘上常驻四个指标:压缩任务队列积压数、CPU使用率与压缩任务占比、数据读取命中后平均解压耗时、以及每日存储净增速率。前两个用来确保压缩任务没有干扰业务,第三个用来评估解压对随机读的影响,第四个用来追踪优化效果是否持续有效。

这里额外建议一点:不要只看刚开始的压测数据,要给系统留一个观察窗口。数据特征会随业务迭代发生变化,可能这个月日志里突然多了一些高熵字段,上个月的压缩参数就不再是最优了。每季度做一次采样复测,重新校准参数,是我在运维这类系统时稳定下来的习惯。

7. 写在最后:一次压缩,长期裨益

我个人在实操中的体会是,存储优化这件事,最迷人的地方不是压缩率有多好看,而是你几乎不用增加什么硬件投入,只靠盘盘数据和制定策略,就能长期地让成本降下来。这和现在动不动就卷显卡数量、卷算力规模的氛围正好相反——好方案不一定要靠硬堆资源,更值得花时间的,是思考如何让每一份资源都发挥出最大价值。

最后再分享一个小技巧,也是我后来养成的习惯:在做任何数据优化之前,先拷问自己一句“这份数据还有没有重复的空间”。不要急着定方案,先去跑一轮抽样压缩测试,把每种方案的收益和开销列在一张表上。省下来的存储空间,才是你真正赚到的算力回血。如果你也准备动手,建议先选一个访问频率低、体积大、压缩空间高的数据集做试点,验证收益之后,再逐步推广到全量。这条路不难,但每一步都需要你认真算账。

相关新闻

LinkSwift:基于Tampermonkey的合规网盘直链工具深度解析

LinkSwift:基于Tampermonkey的合规网盘直链工具深度解析

在云存储资源日益普及但直链获取日趋复杂的背景下,基于浏览器用户脚本的下载辅助工具成为技术爱好者与重度用户关注的焦点。本文深入解析LinkSwift这款基于JavaScript与Tampermonkey开发的开源工具,剖析其在技术实现、合规性声明、安全机制升级及多渠道分…

2026/10/20 7:17:57 阅读更多 →
图转PPT实测横评:截图、课件照片如何一键变成可编辑PPT

图转PPT实测横评:截图、课件照片如何一键变成可编辑PPT

前几天帮同事改一份项目复盘材料,他把去年的PPT导成长图存进手机,今年想直接在上面更新数据,结果发现——文字选不中、图表点不开、连换个主题色都无从下手,只能对着图片一页一页重敲。类似的场景其实很常见:老师手里是…

2026/10/20 7:17:57 阅读更多 →
突破Session 0隔离:远线程注入的令牌路由方案与避坑指南

突破Session 0隔离:远线程注入的令牌路由方案与避坑指南

1. 从需求讲起:服务进程为什么要跨过SESSION 0先说一个我早年踩过的真实场景。当时我在做一个终端管理工具的后台服务,功能很简单:捕获当前登录用户在某个业务系统里的操作行为,做合规审计。服务跑在Windows服务里(Ses…

2026/10/20 7:17:57 阅读更多 →

最新新闻

S7-1200与博途V16在生物发酵控制系统中的实施经验

S7-1200与博途V16在生物发酵控制系统中的实施经验

做自动化这些年,液体、流量、温控项目接过不少,但真正让人睡不踏实的,还是生物发酵这一类。罐子里养的是活物,微生物不会等我把PID调完再繁殖,迟到一小时,整罐料可能就废了。制药厂对批次记录、灭菌温度曲线…

2026/10/20 8:12:29 阅读更多 →
SpringBoot插件化架构实战:原理、接入与避坑指南

SpringBoot插件化架构实战:原理、接入与避坑指南

SpringBoot项目做大了以后,总会出现一种尴尬:功能越来越多,发布却越来越慢;客户需求千奇百怪,又不能每个都单独维护一套分支。我去年负责的中台系统就是这样,每次大促前加一个营销小功能,都要跟…

2026/10/20 8:12:29 阅读更多 →
端侧大脑实战:移动机器人本地闭环的模型压缩与推理优化

端侧大脑实战:移动机器人本地闭环的模型压缩与推理优化

去年有一段时间,我负责的一个移动操作机器人项目——内部代号“灵境智源”——出了个很尴尬的问题:机器人识别工件要靠云端服务,网络一抖,整条机械臂就像被人掐住脖子一样僵在半空,等云端把结果发回来,工件…

2026/10/20 8:12:29 阅读更多 →
串行并行ADMM算法在配电网分布式优化中的Matlab实现

串行并行ADMM算法在配电网分布式优化中的Matlab实现

搞配电网分布式优化这行,绕不开ADMM这三个字母。我最早接到"基于串行并行ADMM算法的主从配电网分布式优化控制研究Matlab代码"这个命题的时候,第一反应是找一套能直接跑起来的模型,把串行和并行两种架构都跑通,再回头补…

2026/10/20 8:12:29 阅读更多 →
监狱防冲突:可穿戴设备+AI多模态融合预警方案实战

监狱防冲突:可穿戴设备+AI多模态融合预警方案实战

1. 从“事后查监控”到“事前防冲突”:这套系统到底在解决什么问题第一次听说把可穿戴设备和AI算法塞进监狱场景,我脑子里蹦出来的不是科幻片,而是两个字:成本。传统监狱管理最头疼的不是关不住人,而是关在一起的人随时…

2026/10/20 8:12:29 阅读更多 →
Deepfake检测新思路:多线索挖掘突破泛化与鲁棒性瓶颈

Deepfake检测新思路:多线索挖掘突破泛化与鲁棒性瓶颈

不得不说,现在做伪造检测,越来越像在玩一场"找茬游戏"的高难度版本。以前是找明显的马赛克、边缘模糊、脸部拼接的硬伤,现在倒好,生成模型进化得太快,肉眼几乎看不出破绽,连传统的检测模型也在快…

2026/10/20 8:11:28 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →