分块、PARTITION BY、分区三者区别:从数据处理到SQL窗口函数到存储架构
1. 先别急着记定义三个词回答的是三个不同的问题你大概率是在这几个场景里分别遇见它们的前端要搞大文件分块上传搜到 lodash 的 chunk刷 SQL 题看到 PARTITION BY 开窗函数建表时又被 DBA 提了一嘴这张表要按日期分区。于是分块、PartitionBy、分区三个词都被归到把数据拆开这个印象里问出来才发现没人能一两句说清。我刚工作那几年也这么懵过。后来带过一个订单数据项目三种用法在同一天里全碰上了才彻底想明白这三个词根本不是一个层面的东西。Chunk / 分块回答的是数据怎么按大小切成一段一段PARTITION BY 回答的是计算时在哪个组里算分区回答的是数据按什么规则存到不同的单元里。1.1 lo Chunk 大概率指的是 lodash 的 chunk 方法这个标题里的 lo Chunk我基本可以断定就是在说 lodash 的 chunk。lodash 是国内前端几乎人手一份的工具库缩写经常写成__.chunk(array, size)就是把一个数组按固定长度切成若干个子数组。中文社区里分块这个词十次有八次是在说这个。需要提醒一下chunk 这个词本身是通用的你在不同地方都会见到。Node 的流里每批读到的 Buffer 叫 chunk文件分块上传的每一片也叫 chunkHTTP 的分块传输编码也叫 chunked。它们共同的语义都是把一个连续的东西切成一段一段和按业务键分组完全是两码事。1.2 PARTITION BY 和分区藏在完全不同的上下文里PARTITION BY 是 SQL 标准里窗口函数window function的一部分写法是OVER(PARTITION BY 列)。它不改变数据怎么存只改变 SQL 引擎在计算时把结果集按什么键分成逻辑窗口。而分区在数据库和大数据语境里更多指物理或逻辑上的存储划分MySQL 的表分区、Hive 里的分区目录、Kafka 里 topic 的分区都是数据组织方式不是计算方式。所以别急着把它们混在一起背先把它们各自的生长土壤分清楚一个在 JS 工具函数里一个在 SQL 查询语义里一个在存储架构里。1.3 先给一句可以背下来的总判断分块Chunk按固定大小切切完每一块没有业务含义只为了方便搬运和处理。PARTITION BY按某个字段把结果集分成若干组在组内做聚合、排名、对比行数不变。分区Partition按某个规则把数据分散到不同存储或并行单元目的是管理、裁剪、扩展。记住这三个目的后面所有细节都是围绕它们展开的。2. Chunk分块不管内容只按固定长度切2.1 lodash chunk 的用法和它底层做了什么lodash 的 chunk 用法很简单import _ from lodash; const list [1, 2, 3, 4, 5, 6, 7, 8]; const groups _.chunk(list, 3); // groups [[1, 2, 3], [4, 5, 6], [7, 8]]注意最后一个子数组只有两个元素这是正常的。chunk 不会因为切不齐就丢数据也不会用一个空值去补位。它底层其实就是循环调用slice逻辑等价于function chunk(arr, size) { const result []; for (let i 0; i arr.length; i size) { result.push(arr.slice(i, i size)); } return result; }所以它有两个与生俱来的特征第一不修改原数组第二切分依据纯粹是下标位置完全不管数组里的元素是什么。你要切的是用户 ID、订单号还是字符串对它来说没有任何区别。还有一个容易忽略的规则size小于 1 时 lodash 返回空数组size为 1 时数组被切成 N 个子数组每个子数组只有一个元素。这在代码审查时偶尔会变成隐藏的坑尤其是当size是从配置或变量传来的。2.2 它和 slice、split 的区别在哪很多人分不清 为什么不用 slice 直接截一段其实答案很简单slice 只给你一段chunk 给你全部切成若干段后的完整集合。const arr [1, 2, 3, 4, 5, 6, 7, 8]; arr.slice(2, 5); // [3, 4, 5]只要其中一段 _.chunk(arr, 3); // [[1,2,3],[4,5,6],[7,8]]全切完打包给你如果你要的是取前 10 个用 slice如果你要的是把 100 条数据分成 10 批去处理用 chunk。字符串的 split 按分隔符切和按固定长度切也是两回事如果想把字符串按长度切成块可以用str.match(/.{1,2}/g)这种偏门写法但本质上还是按位置切的思路。2.3 实战里最典型的两个场景第一个是批量请求。假设有个老接口一次最多接受 500 个 ID而你有 2 万个用户 ID 要逐个查详情。你要是直接循环发两万个请求接口迟早被打爆要是全塞进一个请求又超出限制。正确做法就是用 chunk 把它切成分批const ids await fetchAllUserIds(); // 假设 20000 个 const BATCH_SIZE 500; for (const batch of _.chunk(ids, BATCH_SIZE)) { await Promise.all(batch.map(id fetchUserDetail(id))); // 每批之间按需 sleep避免触发限流 }第二个是大文件分块上传。浏览器端File对象支持的slice方法可以把文件切成多个 Blob前端逐片上传、记录已上传的下标断点续传时只补传失败的那几片。这个动作在业务文档里经常被叫分块上传或分片上传它和分区没有任何关系——切片只是为了对抗网络不稳定和单请求超时。记住一个判断标准只要目的是搬运或分批处理基本就是 chunk 的活如果目的是按规则归档或组内计算那就不是 chunk 的事。3. PARTITION BYSQL 窗口函数里的组内视角3.1 和 GROUP BY 的输出差异这是很多人绕不过的坎PARTITION BY 最常见的混淆对象是 GROUP BY因为两者都是按某列分组。它们最本质的区别是GROUP BY 会折叠行PARTITION BY 不折叠行只是在每一行旁边多算出一列组内聚合值。先看 GROUP BYSELECT dept_id, AVG(salary) AS avg_salary FROM employee GROUP BY dept_id;这个查询返回的是部门列表每个部门一行你看不到任何员工明细。再看 PARTITION BYSELECT emp_id, dept_id, salary, AVG(salary) OVER (PARTITION BY dept_id) AS dept_avg_salary FROM employee;这个查询返回的是每个员工一行dept_avg_salary列告诉你在同一个部门里平均工资是多少。你可以拿salary - dept_avg_salary直接判断这个员工在部门内是高于平均还是低于平均。这就是窗口的含义窗口函数把结果集按PARTITION BY的键切成多个逻辑窗口在每个窗口内部独立计算但输出时所有原始行都保留。对比下来就很清晰比较维度GROUP BYPARTITION BY输出行数分组后每组一行原始行全部保留能否同时返回明细字段不能随便选非分组字段可以典型用途出汇总报表组内排名、组内对比、累计计算是否属于窗口函数不是是必须配 OVER() 使用3.2 最常用的三种写法组内排名、组内聚合列、分组取最新组内排名是最经典的用法最常见的场景是课程成绩排名SELECT student_id, course_id, score, RANK() OVER (PARTITION BY course_id ORDER BY score DESC) AS course_rank FROM exam_score;分组取最新一条是另一个高频场景。比如你有一张登录日志表想拿每个用户最近一次登录记录。直觉写法是 GROUP BY user_id 再取 max(login_time)但那样拿不到那一整条记录的其他字段。窗口函数一行搞定SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_time DESC) AS rn FROM login_log ) t WHERE rn 1;内层先给每个用户的登录记录按时间倒序编号外层只要编号为 1 的那条。这个写法在取每个分组的最新/最大/最早一条场景里是标准答案比做两次 JOIN 或者用相关子查询清晰得多。另外PARTITION BY也可以配合SUM、COUNT、MAX做分组累计或分组对比。比如订单表里想看每一笔订单金额和该客户历史累计消费的差距就能用SUM(amount) OVER (PARTITION BY customer_id ORDER BY create_time)构造 running total。这些都是 GROUP BY 做不到的因为 GROUP BY 一旦折叠行数明细就没了。3.3 PARTITION BY 不是表分区这个误会必须拆掉如果面试官问PARTITION BY 和表分区有什么区别你首先要意识到这个问题其实是两个层面的东西在打架。PARTITION BY 只是计算语义它告诉 SQL 引擎计算的时候按这个键分组。它不会改变数据落盘方式也不会生成任何新的文件或目录。你把它写在一个普通表上完全没问题。表分区是存储设计。它把一张表的数据按照分区键分散到不同的存储片段里目的是方便管理、减少扫描、便于归档。两者是怎么算和怎么存的区别。最容易被绕晕的是 Hive 里的写法建表时用PARTITIONED BY (dt STRING)这是存储层面的分区写 SELECT 时又可能用OVER (PARTITION BY dt ...)这是窗口函数。差了两个字一个在 DDL 里一个在查询里。想在 SQL 里快速判断如果 PARTITION BY 前面没有OVER(那你看到的 PARTITION BY 大概率是建表语句里的存储分区如果它出现在OVER(PARTITION BY ...)这个语法里就是窗口函数。4. 分区Partition把数据按规则放进不同的抽屉4.1 数据库表分区RANGE / LIST / HASH 的选型思路数据库里说分区通常指 MySQL、PostgreSQL 这类关系型数据库的表分区。它的目的是把一张逻辑上完整的表在物理上拆成多个分区存储。以 MySQL 为例常见的有三种切法CREATE TABLE orders ( order_id BIGINT NOT NULL, customer_id INT NOT NULL, amount DECIMAL(12,2), order_date DATE NOT NULL, PRIMARY KEY (order_id, order_date) ) PARTITION BY RANGE (YEAR(order_date)) ( PARTITION p2022 VALUES LESS THAN (2023), PARTITION p2023 VALUES LESS THAN (2024), PARTITION p2024 VALUES LESS THAN (2025) );这里PARTITION BY RANGE是按年份范围切2022 年的数据落在 p2022 分区2023 年的落在 p2023 分区。选 RANGE 一般因为查询天然带时间范围比如查上个月的数据引擎可以只扫一个分区这种能力叫分区裁剪partition pruning。列表型字段适合PARTITION BY LIST比如按地区代码切要打散热点、均匀分布适合PARTITION BY HASH。使用表分区时有几个必须知道的限制。第一分区键需要包含在主键或唯一键里否则建表会报错第二查询条件如果不带分区键分区就是摆设一样全表扫第三分区不是让单条 SQL 变快的银弹它只在你可以裁剪分区时才有效。我见过一张按月分区的表因为排查一个跨半年的问题代价是扫了六个分区还不如建对索引来的划算。4.2 大数据和消息系统里的分区Hive、Spark、Kafka 各有各的脾气到了大数据和消息系统分区这个词的含义稍微扩展了但核心还是按规则分成独立单元。Hive 里建表写PARTITIONED BY (dt STRING, region STRING)底层就是在表目录下生成dt2024-01-01/regionCN/这样的子目录查询时过滤 dt 和 region 能直接跳过大量文件。Spark 里df.write.partitionBy(dt, region)写 Parquet 文件也是同一个思路用分区键来裁剪读取量。Kafka 里每个 topic 分成多个 partition每个 partition 是有序日志消费者并行度上限就是 partition 数量同一个 key 的消息会哈希到同一个 partition。这里的 partition 既是存储单元也是并行单元和数据库表分区在精神上是相通的只是承载的语义不同。4.3 分区、分片、分块别再互相代称分块我们前面说过了是处理时的位置切分分区是按规则切到不同存储单元还有一个词是分片sharding按规则把数据分布到多台机器上。很多人在方案评审里混着用反而让沟通变难。动作切分依据主要目的典型例子分块 chunk固定大小分批搬运/处理文件上传分片、批量查询分区 partition分区键/规则存储组织、查询裁剪、管理MySQL RANGE 分区、Hive 分区目录分片 shard分片键/规则水平扩展、跨机分布分库分表、分布式数据库一句话提示分块是在时间上分批处理分区是在空间上分组存放分片是把数据摊到多台机器。做架构时先分清你要解决的是一次处理太多还是总量太大前者大概率分块后者才考虑分区或分片。5. 一个订单系统里三个概念同时出现的完整案例5.1 从建表到分析的全过程拆解前面分开讲容易真正难的是它们在同一个系统里同时出现。我拿一个订单系统举例子你跟着走一遍就通了。第一步建表。订单表每天新增几十万行要保留两年DBA 按月份做了 RANGE 分区CREATE TABLE orders ( order_id BIGINT NOT NULL, customer_id INT NOT NULL, amount DECIMAL(12,2), order_date DATE NOT NULL, PRIMARY KEY (order_id, order_date) ) PARTITION BY RANGE (YEAR(order_date)) ( PARTITION p2022 VALUES LESS THAN (2023), PARTITION p2023 VALUES LESS THAN (2024), PARTITION p2024 VALUES LESS THAN (2025) );以后每个月数据落在对应分区查询带了order_date范围就能走裁剪。第二步同步。业务要把订单数据同步到搜索集群不能一次性把一个月的数据全塞进内存。同步程序每次拉 500 条批次序列化成 JSON 发给下游拉完一批再拉下一批。这一步用的就是分块思维——用不着真的调_.chunk一个循环加分页 offset 就够但本质是同一个分批搬运。第三步分析。运营想看每个客户在当月每笔订单金额和该客户当月平均订单金额的差距。这个需求就必须用 PARTITION BYSELECT order_id, customer_id, amount, order_date, AVG(amount) OVER ( PARTITION BY customer_id, EXTRACT(YEAR_MONTH FROM order_date) ) AS customer_month_avg FROM orders WHERE order_date 2024-01-01 AND order_date 2025-01-01;PARTITION BY以客户 月份作为窗口键每一笔订单都被保留下来旁边多一列客户当月均值然后就能算差值。同一个库里建表用的分区、搬运用的分块、分析用的 PARTITION BY三者互不替代、各管一段。5.2 为什么这里不能用 GROUP BY也不能拿分块去算如果只想出每个客户每个月平均订单金额这个汇总用 GROUP BY 当然可以而且更简单SELECT customer_id, EXTRACT(YEAR_MONTH FROM order_date), AVG(amount) FROM orders WHERE order_date 2024-01-01 AND order_date 2025-01-01 GROUP BY customer_id, EXTRACT(YEAR_MONTH FROM order_date);但需求里说了要每笔订单金额 vs 当月均值也就是既要明细又要聚合GROUP BY 折叠行之后就回不去了。PARTITION BY 的价值就在于明细 组内统计值同时出现。反过来分块在这里完全派不上用场分块只是搬运方式它不提供任何计算语义你不可能通过切块让 SQL 算出组内均值。5.3 这个案例里最容易出事的三个细节第一分区键没进查询条件。有人写WHERE customer_id 123忘了带order_date分区裁剪直接失效引擎扫了从 p2022 到 p2025 全部分区慢到怀疑人生。第二分块大小拍脑袋。同步程序一开始把 batch size 设成 1 万条结果单批序列化成 JSON 好几兆下游接口超时、内存暴涨。后来改成 500 条稳了很多。分块大小要根据下游处理能力和单条记录体积调不是越大越好。第三ROW_NUMBER 排序不稳定。前面取每个客户最近一笔订单的例子里如果ORDER BY create_time DESC遇到同一时刻多笔订单编号顺序不确定。线上取数要稳定必须加 tie-breaker比如ORDER BY create_time DESC, order_id DESC。6. 一张对照总表和一套自查方法6.1 三个概念的一页纸对照概念按什么切输出结果所在层面关键记忆点Chunk / 分块固定长度/大小多个同构小集合代码、数据流切多大为了搬PARTITION BY分组键字段值原始行保留 组内计算列SQL 计算语义在哪一组里算分区 Partition分区键/规则数据分散到不同存储单元存储、架构放哪个抽屉为了存6.2 写方案和写代码时怎么用词才准确我的建议是在文档和评审里尽量把话说死如果表达一批一批处理数据就说分块/分批处理不要用分区如果表达SQL 里按某个键分组计算排名、聚合列就写使用 PARTITION BY 窗口函数如果表达按日期/字段把数据分散存储才单独用分区。这三个词在口语里混用一时半会没人追究但在接口设计、数据库 DDL 讨论、项目复盘里混用真的会有人照着错误理解去实现。6.3 一个可以随身用的判断问题每次遇到要把数据拆开的需求先问一句我是为了传、为了算、还是为了存为了传分块为了算看需求是出汇总还是保留明细出汇总用 GROUP BY保留明细又要在组内算就用 PARTITION BY为了存再看数据体量和查询模式决定到底要不要分区、怎么分。个人体会是这个问题在带新人和评审代码时特别好用。逼他们把拆数据的目的说清楚之后代码通常也会清晰很多。这三个概念一旦在脑子里有了一致的坐标之后再看到 chunk、PARTITION BY、分区 混在一起的文章和讨论基本就不会乱了。

相关新闻

Linux运维必知:\cp命令绕过别名机制的原理与实践

Linux运维必知:\cp命令绕过别名机制的原理与实践

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

2026/10/13 4:11:02 阅读更多 →
争议型代谢研究高分模板:从选题设计到证据链构建的完整拆解

争议型代谢研究高分模板:从选题设计到证据链构建的完整拆解

昨天半夜刷到一条科研圈的推送:某医科大学代谢团队,用一组最新数据,把此前吵了好几年的一个代谢机制争议彻底收口,文章直接落在一区Top期刊,IF 11.9。点赞很多,但评论区讨论其实有点跑偏——大家只盯着“多…

2026/10/13 4:11:02 阅读更多 →
操作系统处理器管理五条主线:进程调度同步与死锁全解析

操作系统处理器管理五条主线:进程调度同步与死锁全解析

操作系统教材翻到第二章,很多人的崩溃是从“处理器管理”这五个字开始的。前面还觉得自己能理解计算机怎么启动、中断怎么触发,看到进程状态转换和调度算法还勉强能背,等遇到信号量和死锁,就开始怀疑自己是不是不适合学操作系统。…

2026/10/13 4:10:01 阅读更多 →

最新新闻

Android ANR问题全链路分析:从判定机制到测试解决方案

Android ANR问题全链路分析:从判定机制到测试解决方案

我最早接触ANR,是线上用户反馈一个列表页“点了没反应”,过一会儿系统弹窗“进程无响应”。当时拿着一个logcat日志,翻来覆去只能看到一行“ANR in”,完全不知道怎么下手。后来带测试团队、又参与线上性能治理,踩了无数…

2026/10/13 4:56:18 阅读更多 →
微信小程序视频点播系统:从技术选型到部署答辩全攻略

微信小程序视频点播系统:从技术选型到部署答辩全攻略

每年到毕业设计选题的时候,"基于微信小程序的视频点播系统"都会出现在很多人的备选清单里。这个题目听起来很友好,一个小程序端负责展示和播放,一个管理端负责传视频、管分类,但真从设计走到实现,不少人会发…

2026/10/13 4:56:18 阅读更多 →
多租户NPU隔离:PASID与IOMMU如何锁住DMA越界

多租户NPU隔离:PASID与IOMMU如何锁住DMA越界

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

2026/10/13 4:56:18 阅读更多 →
智能合约可升级性实战:透明代理、delegatecall与存储布局全解析

智能合约可升级性实战:透明代理、delegatecall与存储布局全解析

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

2026/10/13 4:56:18 阅读更多 →
Photoshop CS6解压即用版全攻略:绿化原理与启动故障排查

Photoshop CS6解压即用版全攻略:绿化原理与启动故障排查

简介:Photoshop CS6绿色免安装打包版本,压缩包采用zip格式,容量约83.1MB,面向需要快速获得完整图像编辑能力的设计师、摄影师及初学者,解压后即可启动主程序,省去官方安装包的下载、安装及激活流程。压缩包…

2026/10/13 4:56:18 阅读更多 →
AI画图总翻车?四万星开源项目教你用约束策略告别Mermaid Slop

AI画图总翻车?四万星开源项目教你用约束策略告别Mermaid Slop

1. 当AI画的架构图开始“辣眼睛”,这个四万星项目到底在解决什么如果你最近一年用过任何主流大模型来生成架构图、流程图或者时序图,大概率经历过这样一种崩溃:你满怀期待地输入一段描述,AI 信心满满地吐出一大段 Mermaid 代码&am…

2026/10/13 4:55:17 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →