Kettle循环批量同步Oracle到Elasticsearch实战:批次、循环与Job编排
1. 从Oracle到Elasticsearch为什么批量同步这件事值得认真对待做过数据同步的人都有一个共识把数据从关系型数据库搬到搜索引擎听起来只是读出来、写进去两步但真正落地的时候坑几乎全在细节里。尤其是当源端是Oracle、目标端是Elasticsearch中间还要用Kettle做调度的时候批量效率、循环控制、文件落地、Job编排这几件事会同时压过来任何一个环节没处理好整个链路就会变成跑得慢、断得多、查不到。这篇内容围绕的核心场景很明确用Kettle的循环能力把Oracle里的数据批量导入Elasticsearch同时兼顾Oracle循环导出数据文件、Job循环调度这几条常见路径。它适合三类人看一是正在做数据仓库到搜索服务同步的工程师二是需要定时批量搬运历史数据的运维或数据开发三是刚接触Kettle、想搞清楚循环批量多目标怎么组合的初学者。我不会只给你一个转换截图就完事而是把每一步为什么这么做、参数怎么算、哪里最容易翻车都讲透。先说结论性的判断Oracle到Elasticsearch的批量同步性能瓶颈通常不在Kettle本身而在批次大小的设定、索引写入方式的选择、以及循环粒度的划分。很多人第一次做的时候习惯性地把整张表一次性抽出来结果内存爆掉或者ES批量请求超时也有人把循环写得过细一条一条走速度慢到无法接受。正确的做法是在批次和循环之间找到一个平衡点让每一批数据量可控同时让循环负责处理分片和重试。还有一个容易被忽略的点Oracle导出数据文件和直接写ES其实是两种不同的落地策略。导出文件适合做归档、做中间缓冲、做跨环境搬运直接写ES适合实时性要求高、链路短的场景。而Job循环则是把这两者串起来的调度骨架。理解这三者的关系比记住某个组件的配置项重要得多。下面我会按照整体链路设计—Oracle侧抽取与循环—ES侧批量写入—文件导出与Job循环—踩坑与调优的顺序展开每一块都给出可复现的操作思路和参数依据。2. 整体链路怎么搭先想清楚数据流向再动手2.1 三种典型链路形态与适用场景在动手配置任何转换之前先确定你的数据流向属于哪一种。不同的流向决定了循环放在哪里、批次怎么切、失败怎么恢复。链路形态数据流向适用场景循环粒度直连型Oracle → Kettle转换 → Elasticsearch实时性要求较高、数据量中等按主键区间或时间分片循环文件中转型Oracle → 导出文件 → 读取文件 → Elasticsearch需要归档、跨网络搬运、断点续传按文件循环Job层控制纯导出型Oracle → 循环导出多个数据文件数据备份、下游多消费者按分区或按时间段循环直连型的优点是链路短、延迟低缺点是Oracle连接和ES连接同时占用一旦ES写入变慢Oracle的游标会一直挂着容易拖垮源库。文件中转型多了一步落盘但换来的是可重放、可校验、可分批特别适合历史数据迁移这种跑一次但量很大的任务。纯导出型则是把Kettle当成一个带循环的导出工具来用常见于需要按天、按月生成数据文件的场景。我的建议是数据量在百万级以内、且对延迟敏感走直连型数据量在千万级以上、或者需要跨环境走文件中转型。这不是绝对的但能帮你避开大部分性能陷阱。2.2 批次大小到底怎么定一个可计算的经验公式批次大小batch size是整条链路最关键的参数。设得太小循环次数暴涨每次请求的开销占比过高设得太大单次请求体过大ES的bulk队列压力大Oracle端fetch也会占用更多内存。一个实用的估算方式是单批数据量 ≈ min(ES单次bulk建议上限, Oracle单次fetch可承受行数)ES官方对bulk请求的建议是单次请求体控制在5MB到15MB之间这是经验值不是硬限制。假设你的单条文档平均大小是2KB那么5MB / 2KB ≈ 2500条 15MB / 2KB ≈ 7500条所以单批在2500到7500条之间是比较稳妥的。再考虑Oracle端如果一行有几十个字段、包含大文本单行可能到10KB那单批就要降到500到1500条。注意这个数字不是拍脑袋定的而是从请求体大小反推出来的。你可以先用1000条跑一次观察ES返回的took时间和Oracle的fetch耗时再逐步调整。实际配置时Kettle里通常通过表输入的游标配合分页或者主键区间来控制批次。分页方式ROWNUM或ROW_NUMBER在深分页时性能会急剧下降所以更推荐主键区间切片先查出最小和最大主键按步长切分成多个区间循环处理每个区间。2.3 循环的三种实现位置对比Kettle里能做循环的地方有三处转换内的循环组件较少用、Job层的循环作业项、以及通过脚本在转换里自己控制。它们各有取舍。Job层循环适合按文件、按时间段、按分区这种宏观循环。每次循环启动一个完整的转换隔离性好失败可以单独重跑。缺点是每次启动转换有开销循环次数不宜过多几百次以内比较合适。转换内脚本循环适合在一个转换里对多个批次连续处理减少Job启动开销。但脚本逻辑复杂后不好维护调试也麻烦。数据库游标循环在表输入里用游标逐行处理性能最差除非数据量极小否则不推荐。综合下来宏观分片用Job循环微观批次用转换内的主键区间循环这是最稳的组合。后面几节会分别展开。3. Oracle侧抽取循环切片与导出文件的实操细节3.1 主键区间切片的具体做法假设有一张订单表主键是自增的order_id数据量约2000万。直接SELECT *会一次性拉全表内存和网络都扛不住。正确做法是先取边界SELECT MIN(order_id) AS min_id, MAX(order_id) AS max_id FROM orders;拿到min_id和max_id之后按步长比如每批5000切分成若干区间。在Kettle里可以用生成记录配合JavaScript代码生成区间列表也可以用一条SQL直接生成区间SELECT (:min_id (LEVEL-1)*:step) AS start_id, (:min_id LEVEL*:step - 1) AS end_id FROM dual CONNECT BY LEVEL CEIL((:max_id - :min_id 1)/:step);这样一次查询就能得到所有区间然后Job对每一行区间启动一次转换转换里的表输入用WHERE order_id BETWEEN ? AND ?来抽取。提示如果主键不是连续自增有空洞区间切片依然有效只是某些区间可能查不到数据这没关系空批次直接跳过即可。不要为了每个区间都有数据去做额外的判断那反而增加复杂度。3.2 导出数据文件时的格式与命名策略当链路选择文件中转型时Oracle导出的文件格式直接影响后续读取效率。常见的有CSV、定长文本、以及Kettle自带的序列化格式。CSV是最通用的但要注意几个细节字段里如果包含逗号、换行、引号必须做转义否则读回来会错列。Kettle的文本文件输出组件默认会处理引号但你要确认包含字段名和分隔符设置正确。定长文本适合字段长度固定的场景读取时不需要解析分隔符速度快但灵活性差。文件命名建议带上时间戳和区间标识比如orders_20240101_0001_5000.csv orders_20240101_5001_10000.csv这样即使中途失败也能一眼看出跑到哪里了重跑时只需要从缺失的文件开始。命名里不要用中文和空格避免不同系统间传输时出现编码问题。3.3 循环导出时如何避免重复和遗漏循环导出最怕两件事重复导出和漏导。重复通常是因为区间边界处理不当比如用了和导致相邻区间重叠遗漏则是因为区间计算时取整方向错了。用BETWEEN start AND end并且保证end 下一个start - 1就能避免重叠。计算区间数量时用CEIL向上取整保证最后一个区间能覆盖到max_id。这两点看起来简单但实际写SQL时很容易因为FLOOR和CEIL用混而出错。另外导出完成后建议做一次行数校验把所有导出文件的行数加起来和源表的COUNT(*)对比。如果对不上说明中间有区间漏了或者重复了。这个校验步骤在多批次导出时几乎是必须的能帮你省下大量排查时间。4. Elasticsearch侧批量写入Bulk API与索引设计4.1 Bulk请求的组装逻辑Kettle写ES通常通过Elasticsearch Bulk Insert组件或者用REST Client自己拼JSON。前者省事后者灵活。不管用哪种核心都是把一批文档组装成一个bulk请求体。一个bulk请求体的结构是这样的{index:{_index:orders,_id:1001}} {order_id:1001,amount:99.5,create_time:2024-01-01} {index:{_index:orders,_id:1002}} {order_id:1002,amount:120.0,create_time:2024-01-01}每一行文档前面要有一行action元数据。用组件时这些是自动生成的但你要注意_id的指定方式。如果不指定_idES会自动生成这样重复导入会产生重复文档如果指定了业务主键作为_id重复导入会覆盖天然具备幂等性。提示做批量同步时强烈建议用业务主键作为_id。这样即使某批数据重跑了也不会在ES里留下重复记录。这是可重跑设计的关键。4.2 索引的mapping与刷新策略批量写入前索引的mapping要先建好。如果让ES自动推断mapping日期字段可能被识别成text数字字段可能被识别成keyword后续查询和聚合都会出问题。关键字段类型建议字段类型建议ES类型说明主键IDkeyword不需要分词用于精确匹配金额、数量double或long参与数值计算和范围查询时间date指定format便于时间范围查询名称、描述text keyword子字段text用于全文检索keyword用于聚合状态、类型keyword枚举值精确匹配另一个关键设置是refresh_interval。默认是1秒意味着每秒都会刷新索引批量写入时这个开销很大。批量导入期间可以临时设为-1关闭自动刷新导入完成后再改回1s并手动_refresh一次。这个操作能让写入吞吐提升明显。4.3 写入失败的重试与死信处理bulk请求不是全成功或全失败而是部分成功。返回结果里每一项都有status200表示成功429表示限流其他4xx/5xx表示各种错误。如果不检查返回结果失败的数据就悄悄丢了。正确的做法是解析bulk响应把失败的文档收集起来做有限次重试。429这种限流错误退避几秒后重试通常能成功而mapping冲突这种错误重试多少次都没用需要记录到死信队列人工处理。在Kettle里可以用Elasticsearch Bulk Insert组件的错误处理步骤把失败记录写到另一个文件或表里。也可以自己用REST Client在JavaScript步骤里解析响应。前者简单后者可控。数据量大、对可靠性要求高时建议后者。5. Job循环编排把分片、导出、写入串成一条线5.1 Job循环的基本结构与变量传递Kettle的Job循环通常靠作业项 转换 条件判断来实现。一个典型的循环结构是初始化变量起始区间、步长、最大区间判断是否还有未处理的区间如果有执行转换处理当前区间更新区间变量回到第2步变量传递是这里的关键。Kettle的变量作用域分Job级和转换级Job里设置的变量要传到转换里需要用设置变量步骤转换里用${变量名}引用。如果变量没传进去转换里拿到的就是空值SQL会报错或者查出全表。注意变量名区分大小写且不要在变量值里带多余空格。我见过有人因为变量值末尾多了个空格导致SQL拼出来是BETWEEN 1 AND 5000虽然大多数情况能跑但某些数据库会报语法错误。5.2 循环终止条件的写法循环最怕死循环。终止条件必须明确通常是当前区间起始值 最大ID就退出。在Kettle里可以用检验字段的值作业项判断变量是否超过阈值超过则走成功分支结束循环否则继续。还有一种做法是用简单评估作业项直接写表达式。不管用哪种都要保证每次循环变量一定会变化且变化方向是朝着终止条件走的。如果某次循环变量没更新就会无限循环。5.3 失败重跑与断点续传的设计批量任务跑几个小时是常事中途失败不可避免。设计时要考虑失败后能不能从断点继续而不是从头再来。实现方式是在每次成功处理完一个区间后把当前进度写到一个记录表或文件里。重跑时先读这个进度从上次的位置继续。这个进度记录可以很简单就是一行数据last_processed_id。每次循环更新它重跑时用它作为起始值。对于文件中转型进度就是已成功导出的文件列表。重跑时扫描目标目录跳过已存在的文件即可。这种方式更简单也更可靠因为文件本身就是进度的证明。6. 踩过的坑与调优经验6.1 内存溢出与批次大小的关系Kettle默认的JVM内存可能只有几百MB处理大批量数据时很容易OOM。表现是转换跑着跑着突然报OutOfMemoryError或者直接卡死。解决办法有两个一是调大JVM内存在启动脚本里改-Xmx参数比如-Xmx4g二是减小批次大小让单次处理的数据量降下来。两者要配合使用光调内存不控制批次迟早还会爆。还有一个隐蔽的点Kettle的表输入如果用了游标且没有及时关闭连接会一直占着内存也释放不掉。确保每个转换结束后连接正常关闭必要时在转换里加中止步骤强制释放。6.2 时间字段的时区与格式问题Oracle的DATE类型和ES的date类型之间时区和格式经常对不上。Oracle里存的是2024-01-01 00:00:00到ES里可能变成2023-12-31T16:00:00Z差了8小时。根源是Oracle的DATE不带时区信息Kettle读取时按本地时区解释写入ES时又按UTC转换。解决办法是在写入前统一格式比如在Kettle里把时间字段转成字符串yyyy-MM-dd HH:mm:ss然后在ES的mapping里指定format为yyyy-MM-dd HH:mm:ss且timezone为08:00。这样存进去和查出来都是一致的。6.3 循环次数过多导致的调度开销前面提到Job循环适合宏观分片但如果分片过细比如每1000条一个区间2000万数据就是2万个区间2万次Job循环启动转换光启动开销就够呛。经验值是Job循环次数控制在几百到几千次比较合适。如果算下来区间数太多就增大步长让每个区间包含更多数据同时把批次控制放在转换内部转换内再分批写ES。这样Job循环次数降下来转换内部的批次又不会太大两头都兼顾。6.4 并发写入的取舍有人为了提速会开多个Job并行跑不同区间。这确实能提升吞吐但要注意两点一是Oracle端并发查询会加重源库负担二是ES端并发bulk可能触发限流。如果要做并发建议控制在2到4个并行度并且错开启动时间避免同时打满。同时监控ES的thread_pool.bulk.queue指标如果队列积压说明并发太高了要降下来。并发不是越高越好找到源库和目标端都能承受的平衡点才是关键。7. 几个容易被忽略的实操细节7.1 字段映射时的空值处理Oracle里的NULL到ES里如果字段是keyword类型NULL会被当成字符串null存进去查询时会很别扭。正确做法是在Kettle里把NULL转成空字符串或者直接不写这个字段。ES的mapping里可以设置null_value但更推荐在数据进入ES之前就处理好。7.2 大批量导入时的索引副本设置ES索引默认有1个副本意味着每写一份数据要同步到副本分片写入开销翻倍。批量导入期间可以把副本数设为0导入完成后再改回1。这个操作能显著提升写入速度尤其是集群节点不多的时候。改副本数的命令很简单PUT /orders/_settings {index:{number_of_replicas:0}}导入完成后再设回1ES会自动同步副本。7.3 日志与监控的最小配置批量任务跑起来之后你需要知道它跑到哪了、有没有出错。最小配置是Kettle的转换日志级别设为Basic或Detailed输出到文件ES端开启slowlog记录慢查询和慢写入。这样出问题时至少有据可查。不要等到任务失败了才去找日志那时候可能已经跑了一半日志也被覆盖了。养成任务启动前确认日志路径和轮转策略的习惯。7.4 数据一致性校验的做法导入完成后做一次抽样校验从Oracle随机取100条按主键去ES查对比关键字段是否一致。全量校验成本太高抽样校验性价比最高。如果抽样发现问题再扩大校验范围。校验脚本可以用Kettle再写一个转换也可以直接用SQL和ES的查询API对比。关键是这个步骤要固化到流程里不能靠人记得去做。8. 关于这套方案我个人的几点体会做了这么多年的数据同步我越来越觉得Oracle到Elasticsearch的批量导入技术难点其实不在怎么写而在怎么设计循环和批次。工具本身能做的事情有限真正决定成败的是你对数据量、网络、内存、失败恢复这几个因素的综合判断。我自己的习惯是任何批量任务先跑一个1000条的小样本把整条链路走通确认字段映射、时间格式、主键幂等都没问题再放大到全量。这个小步验证的习惯帮我省下了无数次返工。另外进度记录和断点续传一定要在第一次上线时就做进去不要想着先跑通再说因为全量任务失败一次重跑的成本可能比开发这个功能还高。最后分享一个小技巧如果你的区间切片用的是主键但主键分布很不均匀比如某些区间数据特别多可以在切片前先做一次COUNT(*) GROUP BY的采样看看数据分布再决定步长。均匀切片在数据倾斜时会导致某些批次特别慢拖累整体进度。这个采样查询成本不高但能帮你把批次划分得更合理。

相关新闻

ASP.NET Core Cookie身份验证实现与安全配置指南

ASP.NET Core Cookie身份验证实现与安全配置指南

1. 身份验证基础与Cookie机制解析现代Web应用的身份验证主要有三种主流方式:Cookie认证、JWT令牌和OAuth协议。其中Cookie认证因其简单易用、浏览器原生支持的特性,成为ASP.NET Core中最常用的身份验证方案之一。Cookie本质上是一小段存储在客户端的文本…

2026/10/15 9:50:47 阅读更多 →
OpenClaw入门教程:从安装到上手的完整指南(TaoToken 统一 Key 接入版)

OpenClaw入门教程:从安装到上手的完整指南(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/15 9:50:47 阅读更多 →
LiteFlow-03:拥抱 Spring 生态 —— 自动化装配与独占高阶特性

LiteFlow-03:拥抱 Spring 生态 —— 自动化装配与独占高阶特性

LiteFlow-03:拥抱 Spring 生态 —— 自动化装配与独占高阶特性 在前面几章中,我们脱离了所有框架,在纯粹的 Non-Spring(原生 Java/Kotlin)环境下拆解了 LiteFlow 的底层内核。我们看到,原生模式虽然轻量&am…

2026/10/15 9:50:47 阅读更多 →

最新新闻

学Simulink——储能变流器(PCS)中 PWM 整流器的恒流充放电(CC Charge / CC Discharge)仿真

学Simulink——储能变流器(PCS)中 PWM 整流器的恒流充放电(CC Charge / CC Discharge)仿真

目录 手把手教你学Simulink——储能变流器(PCS)中 PWM 整流器的恒流充放电(CC Charge / CC Discharge)仿真 一、为什么储能 PCS 要做 恒流(CC)充放电双向 PWM 整流器 二、PCS 双向控制与 CC 模式原理** 2.1 功率平衡估算(用于 idref​折算) 2.2 模式定义 三、关键…

2026/10/15 10:38:32 阅读更多 →
TaoToken 视角下的示波器使用:measure/acquire/storage/cursor 四步实测

TaoToken 视角下的示波器使用:measure/acquire/storage/cursor 四步实测

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

2026/10/15 10:38:32 阅读更多 →
学Simulink——三相 PWM 整流器在船舶岸电系统(Shore-to-Ship Power, Cold Ironing)中的并网控制仿真

学Simulink——三相 PWM 整流器在船舶岸电系统(Shore-to-Ship Power, Cold Ironing)中的并网控制仿真

目录 手把手教你学Simulink——三相 PWM 整流器在船舶岸电系统(Shore-to-Ship Power, Cold Ironing)中的并网控制仿真 一、为什么船舶岸电系统要用 三相 PWM 整流器/并网变流器 二、岸电系统典型参数(教学模型)** 三、Simulink 建模(手把手)** 3.1 Step 1️⃣ —— 港…

2026/10/15 10:38:32 阅读更多 →
PP-HumanSeg Lite + NCNN C++ 部署实战:精准版本对齐与边缘落地

PP-HumanSeg Lite + NCNN C++ 部署实战:精准版本对齐与边缘落地

简介:本资源是一套面向嵌入式与移动端开发者的轻量级人像分割部署方案,聚焦PP-HumanSeg Lite模型在NCNN框架下的C端高效落地,适用于视频会议背景虚化、AR换装、实时抠图等低延迟场景,适合具备C基础和一定CV部署经验的中高级开发者…

2026/10/15 10:38:32 阅读更多 →
OpenGL正背面剔除与深度测试:原理、配置与穿模问题排查

OpenGL正背面剔除与深度测试:原理、配置与穿模问题排查

1. 从一个“穿模”现象说起:为什么需要正背面剔除与深度测试但凡做过3D渲染的人,几乎都遇到过这样的场景:一个封闭的立方体或者角色模型,旋转到某个角度后,本该被挡住的背面却透了出来,或者两个物体交叠的地…

2026/10/15 10:38:32 阅读更多 →
企业WordPress定制开发:核心价值与选型指南

企业WordPress定制开发:核心价值与选型指南

1. 为什么企业需要专业的WordPress定制开发服务 在数字化浪潮席卷各行各业的当下,企业官网已从简单的"电子名片"升级为集品牌展示、客户服务和业务转化于一体的核心平台。WordPress作为全球占比43%的内容管理系统,凭借其开源特性、丰富的插件生…

2026/10/15 10:37:31 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →