• 问题: 一位开发者的 Mac 上,AI 工具占了 72.6 GiB,光 Codex 就有 53.7 GiB、21,613 个文件。
  • 我们发现: 最大的那批对话里,77% 是图片;其中 39% 是 Agent 压缩上下文时又存了一遍的副本。子 Agent 只占 30%。
  • 我们做了什么: Mint 的 Optimize 会保留继续对话时 Codex 要读的图片。Keep text only 则永久去掉图片、音频和视频,文字全部保留。

Codex、Claude 或 Cursor 占到几十 GB 时,直接删掉整个文件夹可能会丢掉工作记录。先把对话和其中的图片,与缓存、临时构建和虚拟机镜像分开。这篇记录了我们在一台 Mac 上测到的差别;具体操作请结合文中链接的各工具现行清理指南。

所以我们打开看了看。在一台开发者的 Mac 上,AI 工具一共占了 72.6 GiB。光 Codex 就有 53.7 GiB、21,613 个文件。Claude Desktop 11.8 GiB,其中 10.1 GiB 是虚拟机镜像。然后是 Cursor 5.4 GiB,Claude Code 1.5 GiB,Gemini CLI 0.2 GiB。

Mint 的磁盘视图:整块磁盘从分类流向每个字节能做什么,AI Agent 被高亮显示。
这次调查是在 Mint 的磁盘视图里做的。它把整块磁盘画成一张流向图,从每个分类流到你能对它做什么(图里是演示数据)。首页有可以交互的版本,App 里会用你自己的磁盘画出同样的图。 在你的 Mac 上试试 →

总数本身不算意外,我们给别的开发者看过,每个人的数字都差不多。让我们意外的是这些字节到底是什么。几乎没人猜对,我们自己一开始也没猜对。

文字占得很少

大家一般会觉得,Agent 跑得久,写的文字多,堆起来就大了。并不是,文字几乎不占空间。

我们在本机流式读了最大的 50 个活跃会话文件,一共 10.9 GB,给里面每一段内嵌数据都算了哈希。图片占了 10.9 GB 中的 8.43 GB,这份「对话历史」里 77% 是像素:Agent 截的图、它生成的图,还有它只看过一次的可视化工具输出。

接着看这些图片里有多少不重复。8.43 GB 图片里,只有 5.17 GB 是唯一的。3.26 GB,也就是 39%,是同一个文件里已有的内容又存了一遍。 17,643 张内嵌图片里,11,790 张各不相同,5,853 张是重复的。

Mint字节流向哪里10.9 GB 的会话历史里都有什么最大的 50 个活跃会话文件,在本机流式读取并逐块哈希,画法和 Mint 画你的磁盘一样。本次分析10.9 GB图片8.43 GB文本2.47 GB重复图片3.26 GB唯一图片5.17 GB文本2.47 GB图片占了 77% 的字节,其中 39% 是重复的。本机扫描 · 数据不离开这台 Macmintstorage.app
对话的文字本身很小。把磁盘撑满的是像素,而且其中很大一部分是同样的像素又存了一遍。

17,643 张内嵌图片 · 11,790 张唯一 · 5,853 张是文件里已有内容的重复

压缩是怎么产生副本的

会话一长,上下文迟早会用完。为了接着干活,Agent 会压缩历史,把到目前为止发生的事总结一遍,再从摘要往下走。这很合理,也是必须的。

可这些会话文件里的图片,是整张以 data URL 的形式直接内联在记录里的,没有存成指向磁盘文件的路径。写压缩记录时,有一些记录没去引用之前的图片,而是把刚总结过的图片数据原样又嵌了一遍。

于是第一轮带着原图,第二轮带着原图加第一轮的副本,第三轮再把这些全带一遍。每压缩一次,历史就更大一点,而且增长是线性的,跟之前所有图片内容的体积成正比。

每压缩一次,同一张截图就再带上一遍长会话会周期性压缩历史,为上下文腾出空间。会话1 张图片2.1 MB磁盘占用第 同一张图片的 2 份副本4.2 MB磁盘占用第 同一张图片的 3 份副本6.3 MB磁盘占用第 同一张图片的 4 份副本8.4 MB磁盘占用实测:在最大的那个会话文件里,同样的五张图片分别重复了 45 到 136 次。每一轮都把同一张图再存一遍,所以每压缩一次,文件就更大一点。
压缩本来是为了让历史变小。但压缩记录如果把刚总结过的图片数据又原样嵌回去,每一轮都会把之前所有副本再带一遍,文件反而越来越大。

我们看过的最大的单个会话文件有 14 GiB,就是一段对话。里面有 359 次压缩事件、13.6 GiB 内嵌图片数据,唯一的图片内容却只有 155 MiB。99% 是同样的图片反复出现,其中五张图,每张重复了 45 到 136 次。到这一步,压缩记录里装的大多是文件里早就有的图片副本。

字节是从哪来的

网上现在有个很流行的说法,解释 Agent 为什么吃磁盘,听起来也很有道理:Agent 派生 subagent,subagent 继承父任务的历史,每个分支再复制一遍数据,任务树越分越多,Agent 越多副本就越多,直到磁盘满了。

我们一开始也信。不过这台机器上就有能查证的数据,那就查一下。

Codex 有自己的任务数据库,里面有一张派生关系表,记着哪个任务是由哪个任务创建的。我们把磁盘上每个 rollout 文件都对应到它的任务上,然后看这 50.4 GiB 分别在哪。

50.4 GiB 的 Codex 历史都在哪
一台开发者 Mac,通过 Codex 自己的任务数据库逐个归因。
主任务会话(编辑器)32.9 GiB65.4%Subagent 派生任务15.1 GiB30%主任务会话(命令行)2.1 GiB4.2%0 GiB102030
n = 2,744 个 rollout 文件 · 归因依据 Codex state_5.sqlite 的 thread_spawn_edges 表
我们原本也以为 subagent 占大头,外面都是这么说的。但用 Codex 自己的派生关系表把每个 rollout 文件逐个对应之后,结果不一样:subagent 会把问题放大,但三分之二的字节在主任务会话里。

在编辑器里发起的主任务会话占 32.9 GiB,65.4%;派生的 subagent 任务占 15.1 GiB,30.0%;命令行会话 2.1 GiB。三分之二的字节跟 subagent 毫无关系。

这决定了该怎么解决。如果原因是扇出,解法就在怎么用 Agent 上:少开几个 Agent,限制并发,分工时克制一点。这些建议本身有用,但在这台机器上最多只能解决三分之一的问题。

原因在重新内嵌,这用不着 subagent,一段够长、里面有图的对话就够了。subagent 只是把问题放大。只减少 subagent,重复还在;把重复去掉,subagent 那部分也会跟着变小。

「归档」不释放任何空间

还有一件事要提,很多人在这上面白花过一个下午。在 Agent 里归档一段对话,只是把文件从一个目录挪到另一个目录。在我们测的这台 Mac 上,1,174 段已归档对话还占着 16.1 GiB。归档让列表更整洁,但不省空间。东西删掉了,空间才会回来。

如何读取 14 GB 而不把机器搞崩

这里插一段工程上的事,它差点让这次调查做不下去。

我们最早的分析器,是在一个循环里流式读这些会话文件,读过的东西一直不放手,进程就把所有东西都留在了内存里。读 1.15 GB,常驻内存就到了 1,097 MB。拿它去读那个 14 GB 的文件,这台 Mac 直接报了「应用程序内存不足」。

重写以后改成读进同一个可复用的缓冲区,同样读 1.15 GB,常驻内存只有 14 MB。重写之后,完整清点 72.6 GiB 只用了 8.6 秒,常驻 28 MB;深度哈希流式处理 10.9 GB,常驻 42 MB。我们还加了一条运行时检查:读一个文件的过程中,内存涨得太多,这一趟就自己停下来,不会把机器拖垮。

没有这一步,工具根本没法看这些文件里面有什么。一个要 18 GB 内存才跑得起来的分析,谁也没法做成产品发出去。

用去重代替删除

知道这些字节是重复的,该怎么做就好判断多了。

删掉一段对话,丢的是工作本身:推理过程、diff,还有当时为什么做某个决定。不该让人为了腾点磁盘被推着去删。在对话内部去重,什么都不会丢。每张图片第一次出现的地方原样保留,后面的重复都被替换掉。

用去重代替删除去重前同一张截图的 8 份副本,占 8 倍空间去重后↩↩↩↩↩↩↩第一份保留,后面的变成指回它的标记这段对话在 Agent 里照样能打开,截图也都在,而且这个改动可以逐字节还原。
删掉一段对话,丢的是工作本身。在对话内部去重就什么都不会丢:每张图片第一次出现的地方原样保留,后面的重复换成一个指回它的标记。

当时这样改完,对话在 Agent 里照样能打开,截图也都还在。因为第一份一直留在文件里,这个改动能直接从文件本身逐字节还原,不需要保险库,也没有会丢的外部状态。

我们最先上线的就是这个,叫优化,它说的都是实话。后来我们把同样的测量跑遍了整个存储,不只是最大的五十个文件,发现了三件事:对话内的重复是三个池子里最小的;这些重复大多在还在用的对话里;一段对话可能依赖另一段对话的文件,所以改动那个文件并不安全。完整的普查写在《22 GB 的 Agent 对话里到底是什么》里,那篇提到的早期小预览图做法已经停用了。现在 Mint 把两个操作分开:Optimize(优化)保留 Codex 继续受支持对话时读取的图片;Keep text only(只留文字)保留文字,永久移除内嵌图片、音频和视频,原来放图片的地方留一条说明,不是小预览图。

有些东西没变。永久删除删的是整段对话,通过 Agent 本身来删,这样它的索引能保持一致。对话默认都不勾选,Keep text only 和永久删除都会先让你确认,再去动文件。受支持的 Optimize,只要所需的原始数据和历史还在,就可以撤销;Keep text only 和永久删除都撤销不了。具体以你安装的版本在确认框里的说明为准。

我们学到了什么

Agent 存储看起来像个黑盒,主要是因为没人去看,它没那么复杂。那些文件就是你自己磁盘上的纯文本,任务数据库是一个你能直接打开的 SQLite 文件,重复率用一个哈希函数花一个下午就能测出来。

我们一开始想写的是「Agent 会产生很多数据,这里有个清理工具」。查完发现情况更具体:大部分是同一份数据被存了一遍又一遍。有多少你都能看到,精确到每个文件,就在你自己的机器上,什么都不用上传。

所以 Mint 会把数字和原因都摆出来,你不用光凭信任。除非你点「永久删除」,它不会删掉对话。Optimize 保留 Codex 会读取的内容;Keep text only 则是另一种取舍,保留文字并丢弃媒体。现行指南说明了两者的区别。

文中所有数字都是 2026 年 8 月用 Mint 自己的只读扫描在一台开发者 Mac 上实测的。这些扫描是只读的,全部在本机跑,你也可以在自己的机器上复现。