[已解决]Could not allocate CursorWindow of size 2097152 due to error -12:Android 大 Cursor 内存溢出排查与 TaoTo
1. 从一次收银台崩溃说起CursorWindow 分配失败到底卡在哪Could not allocate CursorWindow of size 2097152 due to error -12这个报错第一次看到的人多半会以为是数据库文件坏了或者 SQL 写错了。实际上它跟 SQL 语法、表结构都没关系它是 Android 在给 Cursor 申请一块 2MB 的共享内存时被系统拒绝了错误码 -12 对应的是ENOMEM也就是内存不足。换句话说数据库本身没问题是进程当时已经没有足够的连续内存再开一块 Cursor 窗口了。这个报错在 Android 端做本地数据库的应用里非常典型尤其是收银、零售、订单同步这类场景。它的完整堆栈通常长这样CursorWindowAllocationException从CursorWindow.init抛出经过AbstractWindowedCursor.clearOrCreateWindow、SQLiteCursor.fillWindow最后在getCount()或moveToFirst()时炸掉。如果你用的是 LitePal、Room 或者原生 SQLiteDatabase堆栈里会多一层 ORM 的封装比如org.litepal.crud.DataHandler.query但根因是一样的。它适合谁看适合所有在 Android 上跑本地 SQLite、并且遇到过偶发崩溃的开发者。特别是那种「测试环境好好的一到真实设备、真实数据量就崩」的情况。我见过最典型的触发路径是某个后台线程在断网状态下疯狂重试网络请求每次重试都顺带查一次数据库几百上千次查询叠加每个查询都试图开一个 CursorWindow内存被迅速吃光最后某一次分配就失败了。这里要区分两个概念。CursorWindow 不是普通的 Java 堆对象它是通过 ashmem 分配的共享内存块默认大小在 Android 2.x 到 4.x 时代是 1MB后来变成 2MB也就是报错里的 2097152 字节。它的大小由SQLiteDatabase的CursorWindow配置决定但真正致命的是「同时存在多少个 Cursor 没被关闭」。一个没关的 Cursor 就占着一块窗口几十个叠加起来2MB × N很快就到进程内存上限了。所以排查方向不是去改 SQL而是三件事第一确认是不是有大量 Cursor 没关闭第二确认单次查询是不是返回了过多行或过大的 BLOB 字段第三确认是不是有并发查询在短时间内堆积。下面我会按「先定位、再改代码、最后验证」的顺序把每一步都写成可以直接复制执行的操作。中间涉及日志分析的部分我会用 TaoToken 的统一 API 通道把日志丢给模型做辅助归因这样你不用在多个平台之间来回切。2. 用 TaoToken 统一通道辅助分析 CursorWindow 崩溃日志排查这种内存溢出最费时间的不是改代码而是从一大坨 logcat 里把关键信息捞出来。堆栈里往往混着几十个线程的输出CursorWindow的报错可能只出现两三行但前后关联的查询语句、线程名、时间戳才是定位关键。手工翻日志效率很低我习惯把过滤后的日志片段交给模型做结构化归因让它帮我标出「哪些查询在短时间内重复出现」「哪些线程在并发查库」。这里用 TaoToken 的原因是它把多家模型的调用收敛成一个 OpenAI 兼容的接口Base URL 和 Key 都是统一的我不用为每个模型单独配一套环境变量。对于「分析日志」这种一次性、轻量的任务直接走 API 通道最省事。如果你后面要做长期的代码辅助或者 Agent 类工作流可以再考虑 Coding Plan但本篇的场景用 API 调用就够了。先拿到 Key。打开 https://taotoken.net/api-keys 登录后创建一个新的 API Key复制出来。注意这个 Key 只在创建时完整显示一次先存到安全的地方。然后确认你要用的模型 IDTaoToken 的模型列表在文档里有常见的对话模型都可以直接调。Base URL 固定是https://taotoken.net/api不要加多余的路径。配置方式有两种看你习惯。如果你用 curl 快速验证直接命令行就行如果你要在脚本里批量处理日志用 Python 的 openai SDK 更顺手。下面两段配置都是可复制的路径和字段名跟官方一致。先看 curl 版本用来做单次连通性验证curl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -d { model: gpt-4o-mini, messages: [ {role: system, content: 你是 Android 性能排查助手擅长从 logcat 中定位 CursorWindow 内存溢出根因。}, {role: user, content: 以下日志中 CursorWindow 报错出现了几次涉及哪些线程和查询方法请按时间顺序列出。} ], temperature: 0.2 }再看 Python 版本适合把 logcat 文件读进来批量分析from openai import OpenAI client OpenAI( api_key你的_TAOTOKEN_API_KEY, base_urlhttps://taotoken.net/api/v1 ) with open(cursor_crash.log, r, encodingutf-8) as f: log_text f.read() resp client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: 你是 Android 性能排查助手输出要简洁只列事实和可疑点。}, {role: user, content: f分析以下日志找出 CursorWindow 分配失败的触发链路\n{log_text}} ], temperature0.2 ) print(resp.choices[0].message.content)这里有个细节要注意日志里可能包含数据库路径、包名这类信息如果你在意隐私先把包名和路径做脱敏替换再发。模型只负责归因不负责替你改代码最终判断还是得你自己下。配置好之后先别急着分析真实日志用一句简单的话验证通道是否通。比如发「回复 ok」这种最小请求确认返回正常再进入下一步。如果这一步就报 401说明 Key 没配对如果报连接超时检查网络和 Base URL 是否写成了https://taotoken.net/api注意末尾不要多写/v1SDK 会自动补。3. 可复制的 Cursor 分页与窗口配置从查询到关闭的完整改造定位到问题之后改代码的核心思路是「减少同时存活的 Cursor 数量」和「减少单次查询返回的数据量」。下面给出一套可以直接套用的配置和代码片段覆盖查询分页、窗口大小、以及 LitePal 场景下的关闭策略。先说分页。很多 CursorWindow 溢出是因为一次性SELECT * FROM order把整张表拉出来几万行数据塞进一个 2MB 窗口必然失败。正确做法是加LIMIT和OFFSET或者用基于主键的游标分页。下面是一个原生 SQLite 的分页查询示例public ListOrder queryOrdersByPage(SQLiteDatabase db, long lastId, int pageSize) { ListOrder result new ArrayList(); String sql SELECT id, tid, out_id, amount, create_time FROM retail_order WHERE id ? ORDER BY id ASC LIMIT ?; try (Cursor cursor db.rawQuery(sql, new String[]{String.valueOf(lastId), String.valueOf(pageSize)})) { while (cursor.moveToNext()) { Order o new Order(); o.id cursor.getLong(0); o.tid cursor.getString(1); o.outId cursor.getString(2); o.amount cursor.getDouble(3); o.createTime cursor.getLong(4); result.add(o); } } return result; }注意这里用了 try-with-resourcesCursor 在块结束时自动关闭。这是最关键的一点每一个 Cursor 都必须关闭。如果你用的是 LitePalClusterQuery.find()返回的 List 内部其实已经帮你关了 Cursor但如果你直接拿SQLiteCursor或者用了DataSupport.findBySQL这类底层方法就得自己管。再说窗口大小。Android 允许你通过SQLiteDatabase.setMaximumSize或者CursorWindow的构造参数调整窗口大小但我不建议盲目调大。调大只会让单次分配更容易失败正确方向是调小或者保持默认然后靠分页控制数据量。如果你确实需要处理大 BLOB比如图片或长文本应该把 BLOB 字段单独拆表查询时只取元数据需要时再按主键单独读。下面是一个 LitePal 场景下的改造片段针对报错堆栈里的findRetailOrderByTidOrOutIdpublic RetailOrder findRetailOrderByTidOrOutId(String tid, String outId) { // 原来可能是一次性 find改成带 limit 的查询 ListRetailOrder list LitePal.where(tid ? OR out_id ?, tid, outId) .limit(1) .find(RetailOrder.class); return list.isEmpty() ? null : list.get(0); }limit(1)这一句能挡掉大量无意义的全表扫描。如果你的业务确实需要批量那就用分页循环每页 200 到 500 行处理完一页再查下一页中间让 Cursor 有机会被回收。还有一个容易被忽略的点不要在循环里开 Cursor。报错堆栈里ScheduleTaskSchedule.orderCreateSync2Cloud在断网重试时反复查库每次重试都开一个新 Cursor这就是典型的循环开 Cursor。改法是先把需要的数据一次性查出来缓存到内存重试逻辑只操作内存对象不再碰数据库。如果你用 Room配置方式类似但要注意Query返回Cursor时同样要手动关闭。Room 的Transaction方法里如果嵌套查询也要控制并发。下面是一个 Room 的分页 DAO 示例Dao interface OrderDao { Query(SELECT * FROM retail_order WHERE id :lastId ORDER BY id ASC LIMIT :pageSize) fun loadPage(lastId: Long, pageSize: Int): ListOrderEntity }调用时用lastId递进不要用OFFSET翻大页因为OFFSET越大SQLite 内部扫描的行数越多反而更容易触发窗口分配。最后补一个全局的兜底配置在Application或数据库初始化时确认没有把CursorWindow大小设成异常值。默认 2MB 是合理的不要改成 8MB 或更大。如果你在SQLiteDatabase.openDatabase时传了CursorFactory检查它有没有自定义窗口大小。4. 验证请求与成功结果用日志和命令确认修复生效改完代码不能只看「不崩了」得用可观测的方式确认 Cursor 数量和数据量都降下来了。下面给出一套验证流程从 logcat 过滤到实际请求每一步都有明确的成功标志。第一步抓取修复前后的 logcat 对比。用 adb 过滤 CursorWindow 相关日志adb logcat -c adb logcat | grep -E CursorWindow|CursorWindowAllocationException|SQLiteCursor修复前你会看到Could not allocate CursorWindow ... due to error -12反复出现修复后这个关键字应该完全消失。如果还有零星出现说明还有漏网的 Cursor 没关。第二步用dumpsys meminfo看进程内存变化。在崩溃场景复现前后各抓一次adb shell dumpsys meminfo com.wbm.app.activity | grep -E TOTAL|Native|Dalvik重点看 Native Heap 和 TOTAL 的数值。修复前在断网重试阶段Native Heap 会持续上涨因为 CursorWindow 走的是 native 内存修复后应该保持平稳不会随着重试次数线性增长。第三步验证分页查询的实际返回行数。在代码里加一行日志或者用 adb 直接查数据库adb shell run-as com.wbm.app.activity sqlite3 /data/data/com.wbm.app.activity/databases/cashierDB.db SELECT COUNT(*) FROM retail_order;如果总行数是几万而你的分页大小是 500那单次查询最多只碰 500 行窗口压力就小得多。你可以再跑一次分页查询确认每页返回的行数符合预期。第四步用 TaoToken 通道做一次「日志归因验证」。把修复后的 logcat 片段发给模型让它确认还有没有 CursorWindow 相关的异常。请求体跟第 2 节一样只是把日志内容换成修复后的curl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -d { model: gpt-4o-mini, messages: [ {role: user, content: 以下日志中是否还有 CursorWindow 分配失败如果没有请回复 CLEAN如果有列出线程和次数。} ], temperature: 0 }成功标志是模型回复CLEAN或者你人工 grep 确认零命中。这一步的意义在于模型能帮你发现那些被其他日志淹没的偶发报错比纯 grep 更稳。第五步做一次断网重试的压力测试。把网络断开触发原来会崩溃的同步任务观察 5 分钟。修复前这个场景几分钟内必崩修复后应该能稳定跑完。如果还崩回到第 3 节检查是不是还有循环开 Cursor 的地方。这里要提醒一句验证时不要只看「没崩」还要看「查询结果对不对」。分页改造如果lastId递进逻辑写错可能漏数据。所以每页处理完后把lastId更新为当前页最大 id并且用总数校验一下最终处理的行数是否等于表总行数。5. 本篇常见错排查401、local proxy failed 与 reading choices 报错在配置 TaoToken 通道和改造代码的过程中有几个报错出现频率很高这里逐个对照真实报错给出排查路径。401 Unauthorized。这个最常见原因是 Key 没配对或者请求头格式错了。检查两点一是Authorization头的值必须是Bearer加 Key中间有一个空格不能少二是 Key 本身有没有复制完整有没有把首尾的引号或换行带进去。如果你用的是环境变量$TAOTOKEN_API_KEY先在终端echo $TAOTOKEN_API_KEY确认它真的有值。还有一种情况是 Key 被删了或者过期了去 https://taotoken.net/api-keys 重新生成一个。local proxy failed / connection refused。这个报错通常出现在你本地配了某个代理但代理没启动或者端口不对。TaoToken 的 API 地址是https://taotoken.net/api直连即可不需要额外代理。如果你在代码里设置了HTTP_PROXY或HTTPS_PROXY环境变量先 unset 掉再试。另外检查 Base URL 有没有写错SDK 里应该填https://taotoken.net/api/v1末尾不要多斜杠。reading choices 报错 / choices 字段为空。这个一般不是网络问题而是请求体格式不对。比如messages数组为空或者model字段填了一个不存在的模型 ID。检查你的 JSON 是否合法可以用jq验证一下。还有一种情况是返回了错误对象但你的代码直接去读choices[0]导致空指针。正确做法是先判断响应里有没有error字段有就打印出来。OAuth / 认证失败。如果你用的是某些需要 OAuth 的客户端注意 TaoToken 的 API Key 是 Bearer Token 模式不是 OAuth 流程。不要把 OAuth 的 client_id、client_secret 填到 API Key 的位置。如果你在用 Claude Code 这类工具配置方式是在 settings 里填 Base URL 和 Key具体路径参考官方文档 https://taotoken.net/doc 。CursorWindow 报错在修复后仍然偶发。这时候要检查是不是有第三方库在后台偷偷查库。比如某些统计 SDK、崩溃上报 SDK 会定期读本地数据库。用adb shell dumpsys meminfo看是哪个线程在涨内存再结合 logcat 里的线程名定位。另外检查ContentProvider的query方法有没有正确关闭 Cursor这是最容易被忽略的地方。分页查询返回空但表里有数据。检查lastId的初始值。如果你从 0 开始而表里 id 从 1 开始第一页会正常但如果你的WHERE id ?传的是字符串SQLite 可能做类型转换导致比较异常。统一用long类型传参不要传字符串。LitePal 的find方法仍然报 CursorWindow 错误。LitePal 内部会缓存 Cursor如果你在事务里连续调用find缓存可能没及时释放。改法是减少事务内的查询次数或者改用findBySQL配合手动关闭。另外确认 LitePal 版本老版本有已知的 Cursor 泄漏问题升级到最新版能解决一部分。6. 把日志分析接进日常排查流程这套流程跑通之后你可以把它固化成一个脚本崩溃日志一产生自动脱敏、自动调 TaoToken 通道做归因、自动输出可疑线程和查询方法。这样下次再遇到error -12你不用从零开始翻堆栈。具体做法是写一个 shell 脚本用adb logcat -d导出日志grep 出CursorWindow前后 50 行然后 curl 调模型。模型返回的结果里让它按「线程名 / 查询方法 / 出现次数」三列输出你直接看表格就行。这个脚本可以放在 CI 里每次跑 monkey 测试后自动分析。如果你后面要做更复杂的代码辅助比如让模型直接读你的 DAO 代码找未关闭的 Cursor那就需要更长的上下文和更稳定的调用配额这时候可以了解下 Coding Plan它适合这种持续性的编码辅助场景。但就本篇的日志归因来说API 通道已经够用。最后留一个我实际踩过的坑不要为了让报错消失就把CursorWindow大小调到 8MB 甚至更大。我试过短期看报错少了但 Native 内存涨得更快最后变成整个进程被系统杀掉连堆栈都看不到。正确的方向永远是「少开 Cursor、早关 Cursor、分页查数据」窗口大小保持默认就好。

相关新闻

AI Agent Harness 多语言模型路由:把 endpoint 改到 TaoToken 的实操大纲

AI Agent Harness 多语言模型路由:把 endpoint 改到 TaoToken 的实操大纲

/* 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 12:52:03 阅读更多 →
AI辅助写作工具横向测评:守住学术诚信比降AI率更重要

AI辅助写作工具横向测评:守住学术诚信比降AI率更重要

2026考研和研究生新生最近都在问同一个问题:市面上那些“降AI率”工具到底有没有用?我干脆花了几周时间,把身边同学常用的AI辅助写作工具都过了一遍,做了一份横向测评,顺便把“降AI率”这件事掰开揉碎讲清楚。 先亮明…

2026/10/12 12:51:02 阅读更多 →
机器学习驱动的船舶碳排放优化:从EEOI到航速寻优实践

机器学习驱动的船舶碳排放优化:从EEOI到航速寻优实践

简介:Python基于机器学习的船舶碳排放数据驱动优化分析系统,是在导师指导下完成的毕业设计高分项目,评审得分99分,代码完整可运行,适合计算机相关专业学生用于毕业设计、课程设计或期末大作业实战参考。项目包共33个文…

2026/10/12 12:51:02 阅读更多 →

最新新闻

website-rebuild-skill 源码化阶段:如何把逐字移植的机器产物重构成人能读的工程

website-rebuild-skill 源码化阶段:如何把逐字移植的机器产物重构成人能读的工程

【免费下载链接】website-rebuild-skill 复刻网站的 Agent Skill:抓只读镜像、从压缩代码逐行还原、自动比对验收。An agent skill that mirrors a website, rebuilds it from the minified code, and verifies the result with automated diffs. 项目地址&#xff…

2026/10/12 13:41:54 阅读更多 →
基于SpringBoot的大健康养老公寓管理系统:从毕设选题到答辩全攻略

基于SpringBoot的大健康养老公寓管理系统:从毕设选题到答辩全攻略

1. 为什么选“大健康养老公寓管理”这个题目每年到这个时间点,总有同学来找我聊毕业设计的事,问得最多的就是:有没有合适的题目推荐?要求还五花八门——好过审、工作量够、技术栈主流、最好还能润色到简历里。我通常会反问一句&am…

2026/10/12 13:41:54 阅读更多 →
CAD二次开发中点在多边形内的高精度实时判断方案

CAD二次开发中点在多边形内的高精度实时判断方案

1. 这不是数学题,是CAD里每天都在发生的“位置判断”实战在CAD二次开发的实际项目中,“点是否在多边形内”绝不是教科书里一个画个示意图就能打发的几何问题——它是某高校土木系BIM协同平台里构件自动归类的触发条件,是某工业设计公司电缆布…

2026/10/12 13:41:54 阅读更多 →
动态规划空间压缩实战:前缀和与后缀最大值求解两段不重叠子数组最大和

动态规划空间压缩实战:前缀和与后缀最大值求解两段不重叠子数组最大和

1. 从一道“数学考试”题看动态规划的空间压缩技巧“数学考试”这个标题乍一看像是讲备考策略,实际上它是一道经典的算法题,出现在某在线编程平台的每日一题栏目中。题目的核心是:给定一个长度为 n 的整数序列,要求选出两个不重叠…

2026/10/12 13:41:54 阅读更多 →
NGS-GNN:面向临床响应预测的图神经网络实战

NGS-GNN:面向临床响应预测的图神经网络实战

简介:本资源是一个面向生物信息学初学者与机器学习实践者的轻量级教学项目,聚焦于下一代测序(NGS)数据分析与Python建模的交叉实践。项目以Jupyter Notebook为核心载体,提供可复现的端到端分析流程,涵盖环境…

2026/10/12 13:41:54 阅读更多 →
C语言播放《下山》:从Beep到WAV的音频编程全解析

C语言播放《下山》:从Beep到WAV的音频编程全解析

前段时间在编程群里看到有人甩了个标题:「疯狂的往左」用 C 语言播放《下山》。一看名字就知道,这是典型的整活向练手题——不用图形界面,不用现成的音乐库,纯粹拿 C 语言的朴素能力让电脑把这首国风歌“唱”出来。我第一次见这种…

2026/10/12 13:40:52 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →