PostgreSQL CRUD性能优化:从底层机制到SQL实践
上手第一件事我先说句实在话PostgreSQL的增删改查CRUD语法不难随便翻两页文档就能写出来。但等表里的行数从几十万涨到几千万或者并发量从每秒几十涨到每秒几百你会发现原来那套“能跑就行”的SQL突然变得又慢又僵。这篇文章不谈理念只谈实务想把CRUD相关的底层机制、SQL正确姿势、索引取舍以及性能参数说清楚。适合刚入门PG的后端工程师也适合那些已经在生产环境里跟慢SQL搏斗了一段时间、想系统梳理一遍的人。1. 写CRUD之前得先明白PostgreSQL在底层干了什么1.1 一条INSERT背后不只是写一行数据很多人把INSERT理解为“往表里塞一行”这从业务语义上没错。但从引擎内部来看一条INSERT语句往往要触发一连串动作先在数据页中找到可插入的位置写入最新行版本然后生成一条WALWrite-Ahead Logging日志记录如果表上有索引还要依次为新行在每一个索引中插入对应的索引条目。表上的索引越多单条INSERT需要更新的索引页就越多写放大也就越严重。我见过一个实际案例某项目为了查询方便在一张大表上加了8个索引结果每秒钟只能插入几百条数据。排查时通过pg_stat_user_indexes看到其中好几个索引在业务查询里几乎从未被使用但它们每一笔INSERT都在默默增加成本。后来砍到仅保留两个必要索引写入吞吐翻了不止一倍。所以说一条INSERT“背后”的成本在数据量小的时候完全不痛不痒一旦写入并发高起来索引数量就是第一个需要审问的对象。1.2 MVCC与VACUUM为什么UPDATE/DELETE会留下“垃圾”PostgreSQL的并发控制核心是MVCC全称Multi-Version Concurrency Control。它的设计思路是让读不阻塞写、写不阻塞读。实现方式很有意思UPDATE一行时PG不会直接修改原来的那个行版本而是在数据页里生成一个新版本同时保留旧版本。DELETE也类似逻辑上标记该行为删除但物理空间并不会立刻释放。这些旧版本行叫做“死元组”dead tuple它们必须由VACUUM或后台自动清理进程autovacuum来回收。这个机制对CRUD性能的影响是隐形的。假设你每秒更新同一行100次那么这一行在表里会留下大量死元组。表面上看表的行数没增加但表占用的磁盘空间在涨查询扫描的数据页变多内存命中率下降于是所有SELECT、UPDATE、DELETE都跟着变慢。最恶心的是一旦死元组堆积超过阈值autovacuum会启动一次大规模的清理产生很高的IO峰值直接拖垮同一段时间内的业务请求。所以做CRUD不能只盯着语句本身要时刻关注表的膨胀率和autovacuum状态。1.3 autovacuum与事务ID回卷这是一个隐藏雷区MySQL或Oracle的开发者刚接触PG时往往不太理解为什么PG这么依赖VACUUM。除了回收死元组VACUUM还有一个重要使命推进事务ID。PostgreSQL的事务ID是32位的相当于整个数据库集群范围内最多可以产生约42亿个事务。理论数值很大但如果业务非常繁忙每秒产生几百个事务那么一年下来就是千万级实际上很多大库在几年内就会逼近回卷临界点。一旦事务ID差值达到约20亿PG会触发强制anti-wraparound autovacuum。这种情况下数据库会把大量表锁定在“不能正常业务访问”的状态集中进行清理很多团队称之为“冻结风暴”。我记得有个朋友所在的团队就踩过这个坑系统正常上线两年多某一天所有写操作突然被卡住查日志才发现是强制清理导致。这个问题的解法并不复杂只要保证autovacuum始终开启并定期用下列SQL检查库的年龄和冻结事务边界SELECT datname, age(datfrozenxid) AS xid_age, datfrozenxid FROM pg_database ORDER BY xid_age DESC;如果age(datfrozenxid)已经超过几亿就需要手工执行VACUUM FREEZE或调整autovacuum参数了。这虽然不直接属于CRUD语法但频繁的增删改查正是推进事务ID的根本原因忽略它等于坐等事故。2. 基础CRUD的正确姿势与常见误区2.1 INSERTRETURNING、批量插入与ON CONFLICTINSERT最容易被忽略的两个特性是RETURNING和ON CONFLICT。过去很多人插入数据后要再发一条SELECT去拿自增id不仅多一次网络往返还可能在并发场景下拿错。RETURNING可以直接在INSERT之后返回任意列甚至返回一个计算表达式INSERT INTO orders (user_id, product_id, quantity, price) VALUES (1, 101, 2, 15.00), (2, 102, 1, 30.00), (3, 103, 3, 12.50) RETURNING id, user_id, quantity;批量插入时多VALUES语句相比循环单条插入更推荐因为数据库只需要解析并执行一次。但要注意单个SQL里VALUES条数不宜过多我一般控制在200到1000行之间太大会导致执行计划复杂、内存占用上升。ON CONFLICT是PostgreSQL实现“有则更新无则插入”的最佳方式。比如用户修改标签名称同时希望保留主键一致性INSERT INTO tags (name, slug) VALUES (postgres, postgres) ON CONFLICT (name) DO UPDATE SET slug EXCLUDED.slug RETURNING *;这里的EXCLUDED代表本语句试图插入的那一行的伪表。使用ON CONFLICT要注意冲突目标必须是唯一索引或约束覆盖的列。很多新手在字段没加唯一约束时直接使用ON CONFLICT结果报错然后抱怨PG不好用。所以先建好唯一约束再谈upsert。2.2 UPDATEJOIN更新、带条件的更新以及返回变更行普通UPDATE很简单但业务里经常需要根据另一张表的条件来更新目标表。PostgreSQL允许在UPDATE中使用FROM子句这是它与标准SQL的一个差异点。例如把某个状态下的用户全部拉黑UPDATE users u SET status v.new_status FROM (VALUES (1, blocked), (2, blocked) ) AS v(id, new_status) WHERE u.id v.id RETURNING u.id, u.status;有两点必须提醒。第一UPDATE的WHERE条件如果不能走索引PG就得顺序扫描整张表再逐行更新这种全表UPDATE对性能的冲击是毁灭性的。第二PG的UPDATE机制是生成新行版本所以更新某一个字段时整行的数据都会被复制一遍。这意味着一个宽度极大的表即使只更新一个长度很短的字段付出的代价也和重写整行差不多。这里有个实战经验如果把经常更新的字段拆到单独的“热表”中让主表行宽保持小更新性能会好很多。这个结论我在一个模拟订单系统里验证过把订单状态和订单明细分离之后同量级状态更新的耗时下降了约40%。不是所有场景都需要垂直拆分但遇到长期更新的行宽超过1KB时值得认真考虑。2.3 DELETETRUNCATE与DELETE的差距USING的用法DELETE同样不是物理删除而是给行打删除标记之后靠VACUUM回收。正因如此如果需要清空一张表用DELETE删除所有行和直接用TRUNCATE有本质区别。TRUNCATE直接把整个数据文件重写“秒清”且不产生死元组也不逐行记录WALDELETE则会逐行标记、逐行记日志还会留下海量死元组。如果你的业务语义是“清空历史表”不要犹豫用TRUNCATE而不是DELETE。有条件的删除通常需要关联其它表。例如删除所有被封禁用户的订单DELETE FROM orders o USING users u WHERE o.user_id u.id AND u.status blocked RETURNING o.id;大批量删除是我特别想强调的坑。很多团队一次性执行DELETE WHERE id IN (几百万个id)然后数据库长时间卡在清理阶段。一个比较稳妥的做法是分批删除比如每批1000条中间sleep一小段时间既能控制锁粒度也给autovacuum留出干活的空间。具体写法可以借助LIMIT子查询循环或使用ctid批量切块。分批次会多写一些代码但能让数据库稳定得多。2.4 SELECT查询优化基本盘但CRUD也离不开严格来说SELECT是R不是“增删改”中的D但实际系统里CRUD四个字母中读取往往占大头。对于UPDATE和DELETE来说第一步都是先定位到目标行这个定位过程本质上也是SELECT逻辑。一个UPDATE语句的WHERE条件如果写不好可能比纯粹SELECT慢得多因为它既要找到行又要维护索引。所以我的习惯是优化UPDATE/DELETE之前先把它改写成等价的SELECT用EXPLAIN看看扫描路径、预计行数、是否用上索引。如果SELECT都走的是Seq Scan那UPDATE大概率也不会快。反过来只要SELECT能利用好索引UPDATE/DELETE的定位成本就能压得很低。很多人一上来就调数据库参数却不检查SQL本身方向就错了。3. 事务、锁与隔离级别CRUD并发性能的分水岭3.1 默认配置下的隐式事务与提交延迟PostgreSQL默认开启自动提交也就是每一条单独的SQL都会被当作一个独立事务运行。在测试环境里这没问题但到生产环境面向业务的CRUD几乎都需要显式地组装事务把多个操作捆绑在一起。这样做的第一个好处是原子性第二个好处是减少提交次数。事务提交最昂贵的部分是持久化PG要把事务产生的WAL记录刷到磁盘确保即使断电也不丢数据。每多提交一次就多一次fsync等待。因此把一批CRUD合并到一个事务里相比每条语句单独提交整体可能快数倍。但也不是事务越大越好过大的事务会拖长锁持有时间并抑制autovacuum的清理进度所以要在“不要太小”和“不要太大”之间找平衡。一般而言几十到几百条操作一个事务是比较常见的区间。3.2 隔离级别读已提交 vs 可重复读后果不同PG的默认隔离级别是读已提交这对大多数业务够用但很多开发者并不了解它和可重复读的实际区别。在读已提交级别下事务内不同的SELECT语句各自看到一个独立的快照两次查询之间如果有其它事务提交了修改那么第二次查询能看到新的版本。可重复读则更严格整个事务从头到尾使用同一个快照事务启动后其它事务的提交对本事务不可见直到本事务结束。这两种级别对UPDATE行为也有影响。在可重复读下如果某个并发事务修改了你正在修改的行PG可能会在提交时报“能否串行化”之类的冲突错误业务侧需要重试。读已提交虽然没有这种冲突报错但同一个事务内两次读到不同数据可能导致逻辑判断前后不一致。报表、对账这类对一致性要求较高的场景我建议业务代码显式使用可重复读并做好序列化失败的捕获和重试。实际配置时通过SET TRANSACTION ISOLATION LEVEL REPEATABLE READ即可。3.3 死锁与锁等待CRUD遇到并发时的真实表现并发CRUD中死锁几乎是必然要遇到的一课。举一个简单的例子事务A先更新id1再更新id2事务B先更新id2再更新id1两个事务互相等待对方持有的行锁PostgreSQL会在等待超时后主动回滚其中一个事务。虽然死锁无法完全杜绝但通过规范业务代码中的更新顺序可以大幅降低发生概率。比如所有涉及多行更新的地方都要求按主键排序后统一更新。另外要养成长事务监控的习惯。一条糟糕的UPDATE可能长时间持有锁阻塞后续所有相关写的CRUD。我从pg_stat_activity里看阻塞会话的常用语句是SELECT pid, state, wait_event_type, wait_event, now() - xact_start AS duration, query FROM pg_stat_activity WHERE state active AND now() - xact_start interval 5 seconds ORDER BY duration DESC;这个查询能在业务变卡时快速定位到“谁锁住了我”。再配合pg_locks查看具体锁对象基本几分钟就能找到罪魁祸首。无脑重启数据库或者盲目杀进程都不是好办法先看清楚锁链再动手。4. 索引读性能的加速器写性能的隐形杀手4.1 索引不是越多越好写放大效应索引就是为了让查询更快这是直觉。但写放大这层逻辑很容易被忽视每一次INSERT都要把所有索引更新一遍每一次UPDATE如果被更新的列不在索引列中索引本身不必变但如果在索引列中索引也要跟着改DELETE则需要在所有索引中删除对应条目。因此索引越多增删改越慢磁盘空间也越大。很多从MySQL迁移过来的团队喜欢把之前“冗余索引”的习惯带过来。比如一个表中已经建立了(a, b)联合索引又单独建了a字段的单列索引其实后者完全是冗余的。在PostgreSQL里检查重复索引可以用pg_stats或通过pg_index对比索引列。我习惯每隔一段时间跑一下pg_stat_user_indexes重点看idx_scan接近0的索引这些索引基本属于“只拖后腿、不干活”的成员可以和安全删除。4.2 组合索引与部分索引的设计原则组合索引的列顺序直接决定它能服务哪些查询。经验法则是把等值过滤条件的列放在前面把范围过滤条件的列放在后面。比如查询是WHERE user_id ? AND created_at ?那么建立(user_id, created_at)索引就比(created_at, user_id)更合适。前者能先用user_id定位到目标切片再在切片内用created_at过滤后者往往需要更多的回表。部分索引是PG里很有价值的武器。比如订单表里有99%的行都是“待支付”只有1%的行是“已支付”或“关闭”。这时候建立一个WHERE status active的部分索引索引体积会非常小维护成本也低扫描速度极快。我以前在一个交易系统的撮合表上用部分索引把一个频繁执行的查询从百毫秒级别压到了个位数毫秒级CREATE INDEX idx_orders_active ON orders (user_id) WHERE status active;需要注意使用部分索引的前提是查询模板里总是携带同样的过滤条件否则优化器不会选择它。4.3 用EXPLAIN验证CRUD执行计划纸上谈兵再多都不如亲手跑一次EXPLAIN。我要求团队里写CRUD之前至少要会看执行计划里有没有“Seq Scan on”的字样、有没有“Rows Removed by Filter”特别大、有没有临时文件排序。最常用的命令EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM orders WHERE user_id 1 ORDER BY created_at DESC;加BUFFERS可以看缓冲命中数还能判断是否发生大量物理读。对UPDATE或DELETE可以先在事务里用EXPLAIN再ROLLBACK避免真的改到数据。比如BEGIN; EXPLAIN (ANALYZE, BUFFERS) UPDATE orders SET status paid WHERE user_id 1; ROLLBACK;这种“事务内explain”对线上排查特别友好既拿到执行计划又不影响真实数据。很多慢CRUD的根本原因其实在EXPLAIN输出的第一行就已经暴露了。5. 批量增删改的性能调优从参数到SQL写法5.1 批量插入的几种方案对比与实测体会批量插入是CRUD里最常被优化的一环。我整理了一个方案对比基于我自己的测试和实践场景方案适用场景性能特点备注单条INSERT循环数据量小、实时性要求极低的场景最慢网络往返多代码简单但绝不适用于高吞吐写入多VALUES批量INSERT应用侧一次性提交几百到几千行解析一次比循环有数量级提升注意单条SQL大小别超过内存限制Prepared Statement批量执行同一SQL模板反复执行减少SQL解析和计划生成开销配合PgJDBC或psycopg2的batch能力COPY/COPY FROM大规模数据迁移、导入导出通常是最快的批量写入方式数据格式要求严格适合离线导入从工程实践上看应用侧处理普通写入任务时多VALUES批量INSERT是性价比最高的方案。我曾经用一个模拟订单数据的项目测过100万行数据单条循环耗时将近8分钟改为每批500条多VALUES之后耗时降到了45秒左右。如果再配合关闭同步提交还能继续压缩。这里多提一句PG没有MySQL那种UNIQUE键冲突时会整个事务失败的问题ON CONFLICT可以在批量场景下逐条处理冲突但这时的写入性能会略低于纯INSERT。5.2 work_mem与临时文件排序和哈希操作吃紧时work_mem这个参数经常被误解为“内存越大越好”。其实它控制的是单个排序操作、哈希连接或去重操作在内存中可使用的大小。如果估算的数据量超过work_memPG就会先把结果写到磁盘临时文件里再继续排序或哈希这会明显拖慢CRUD中嵌套的查询和更新逻辑。但work_mem不能全局设太大因为它不是共享内存池而是每个会话、每个操作单独分配。如果设成1GB同时有50个并发会话做排序瞬间就可能撑爆内存。我比较推荐的做法是全局保持一个相对保守的默认值比如64MB或128MB然后对关键会话或复杂查询通过SET work_mem临时调大。也可以用pg_stat_statements找出那些产生“临时文件”的语句再针对这些语句做个性化的参数调整SELECT query, temp_files, temp_bytes FROM pg_stat_statements ORDER BY temp_bytes DESC LIMIT 10;这一步往往是优化慢UPDATE或复杂DELETE时被忽略的关键点。很多情况下问题不在CPU和IO而是在排序溢出到了磁盘。5.3 synchronous_commit与WAL策略取舍CRUD的性能瓶颈很大一部分来自事务提交时要刷WAL。PostgreSQL提供了synchronous_commit参数决定在提交返回成功之前WAL必须刷到什么程度。默认值是on要求WAL刷到稳定存储。如果允许把该值设为off事务提交时不会等待WAL落盘而是交给后台进程稍后批量写入这能明显降低单个事务的延迟和磁盘IO压力。必须讲清楚的是synchronous_commitoff不代表数据一定会丢只是如果数据库所在机器在提交后、WAL刷盘前崩溃那么这些已提交的事务可能消失。对于可以接受极少数据丢失的内部系统或者某些日志型场景这是个很实用的加速开关。如果还是担心可以折中设置成remote_write它在流复制场景下有更明确的语义。我一般在非金融类项目里会把默认的synchronous_commit保持为on但在批量导入或大量写日志时临时改为off等导入完成后改回来。5.4 maintenance_work_mem与VACUUM/重建索引时的加速最后一处参数优化集中在维护场景。VACUUM、REINDEX、CLUSTER、CREATE INDEX这类操作使用的是maintenance_work_mem与普通查询用的work_mem相互独立。如果数据库阶段性地需要把大表重新建立索引或者autovacuum长期跟不上膨胀速度可以适当提高maintenance_work_mem。例如在64GB内存的数据库服务器上给到1GB到2GB是常见的设置。同时要关注autovacuum的触发阈值。PostgreSQL默认的autovacuum_vacuum_scale_factor是0.2意味着表里有20%的行发生变化后才触发自动清理。这对小表没问题但对上亿条记录的大表20%就是几千万行清理一次极耗资源。建议把大表单独设置为更小的scale_factor比如0.05或者干脆用一个固定阈值autovacuum_vacuum_threshold。实际执行时可以使用ALTER TABLE来指定表级参数范围比全局调整更精准。我在实际运维中每隔几周就会做一次“表级体检”通过pg_stat_user_tables查看死元组数量、last_autovacuum时间、n_tup_upd/n_tup_del增长趋势。如果发现某张大表的last_autovacuum已经是很久以前的事而死元组比例却在快速上升我会触发一次手动VACUUM或VACUUM ANALYZE。这套习惯帮我避开了好几次因为CRUD过于频繁、清理没跟上而导致的全表膨胀事故。毕竟CRUD的“增删改查”四个字看着简单背后的运维功夫往往才是系统长周期稳定的关键。

相关新闻

两节锂电池串联均衡:从芯片误用到容量协同控制

两节锂电池串联均衡:从芯片误用到容量协同控制

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

2026/10/17 1:18:19 阅读更多 →
移动平均在SQL、Power BI、Excel中的实现与避坑指南

移动平均在SQL、Power BI、Excel中的实现与避坑指南

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

2026/10/17 1:18:19 阅读更多 →
基于Quartz的分布式调度任务管理WebUI组件设计与实践

基于Quartz的分布式调度任务管理WebUI组件设计与实践

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

2026/10/17 1:18:19 阅读更多 →

最新新闻

三语言实现大文件分片上传实战

三语言实现大文件分片上传实战

文件上传功能实战:Java、Python、PHP 实现大文件分片上传在现代 Web 应用开发中,大文件上传是一个常见且复杂的场景。传统一次性上传方式在面对 100MB 以上文件时,容易因网络波动、超时或内存溢出导致失败。分片上传(Chunked Uplo…

2026/10/18 8:14:12 阅读更多 →
自组织映射SOM原理与Python实现:从竞争学习到拓扑保持

自组织映射SOM原理与Python实现:从竞争学习到拓扑保持

简介:这份资源是面向机器学习初学者与数据科学学习者的SOM自组织映射神经网络Python实现项目,聚焦无监督学习中的数据降维、聚类与可视化需求。SOM通过竞争学习将高维输入映射到低维拓扑空间,是理解神经网络竞争机制的经典入门算法&#xff0…

2026/10/18 8:14:12 阅读更多 →
多步流程中的越权漏洞剖析与修复实践

多步流程中的越权漏洞剖析与修复实践

前阵子做一次授权安全评估,某项目的后台审批流程让我印象很深。这个系统有一条"发起申请 → 业务审批 → 办结归档"的三步链路,前两步做得挺规范,登录校验、状态控制、角色校验都到位了。问题恰恰出在最后一步:审批接口…

2026/10/18 8:14:12 阅读更多 →
开发岗没出路?四条转型路线与实操避坑指南

开发岗没出路?四条转型路线与实操避坑指南

做开发这些年,我越来越常听见身边人问:“开发岗是不是没出路了?”起因无外乎三种:投了一轮简历回复寥寥,面了几轮被源码级问题问到怀疑人生,或者眼看部门收缩、项目砍掉,今天还在维护老系统&…

2026/10/18 8:14:12 阅读更多 →
LangChain六组件完全指南:模型、提示词、链、记忆、检索、Agent

LangChain六组件完全指南:模型、提示词、链、记忆、检索、Agent

很多人第一次打开 LangChain 的文档,都会被那一大堆 Module 名字吓到——模型、提示词、链、记忆、检索、代理、回调,好像每个都能单独写一本书。但如果你退一步看,LangChain 其实只做了一件事:把大模型和各类外部能力串联起来。而…

2026/10/18 8:14:12 阅读更多 →
一阶倒立摆平衡车仿真与GUI调参工具:从建模到源码全解析

一阶倒立摆平衡车仿真与GUI调参工具:从建模到源码全解析

先说个反直觉的结论:做平衡车,最花时间的不一定是焊板子和调实车,而是把一阶倒立摆模型在GUI里跑通。我见过太多人上来就调PID,参数改来改去,最后连车为什么一直朝一个方向冲都说不清楚——根子在于脑子里没有一个能复…

2026/10/18 8:13:12 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →