删了 conda 环境 Mac 空间没回来怎么办
做几个月数据分析,Mac 上就会攒下一堆想不起来是什么时候建的 conda 环境,一门课一个,一篇论文一个,试过一次的工具又一个。每个环境都有自己的一份 Python 和包,加上 conda 的包缓存,加起来常常有几十 GB。删掉它们只要两条命令,但第一条跑完空间往往没怎么回来,原因在 conda 怎么在环境之间共用文件。
这篇讲怎么列出现有环境、按名字或路径删掉一个环境、为什么删完磁盘数字几乎没动,以及怎样用 conda clean 把剩下的空间拿回来,Anaconda、Miniconda、Miniforge 和 Mambaforge 都适用。如果是想把 conda 整个卸掉,在 Mac 上卸载 Python 和 Node 那篇讲了。
列出你的环境
conda env list
conda info --envs 给出的是同一份列表,当前激活的环境前面有个星号,每一行是它的文件夹,一般在 ~/miniconda3/envs/<name> 或 ~/anaconda3/envs/<name>。没有名字的那一行是 base,conda 自己就装在里面,别动它。
看每个环境占多少:
conda info --size
它报的是 conda 自己统计的各环境占用,如果你的 conda 版本没有这个参数,就直接量文件夹:
du -sh ~/miniconda3/envs/* ~/miniconda3/pkgs
把 miniconda3 换成 anaconda3、miniforge3 或 mambaforge,和你装的那个对上。
删之前先存一份
以后可能还要用的环境,留一个小文件就够了,先激活再导出:
conda activate myenv
conda env export --from-history > myenv.yml
--from-history 只写你当初明确装过的包,换一台 Mac 或者换个新版本 conda 也能重建。想在同一平台上一模一样地还原,就用 conda list --explicit > myenv-spec.txt。以后用 conda create --file myenv.yml 就能把环境建回来,旧版本用 conda env create --file myenv.yml。
删掉一个环境
conda 文档写明删除时这个环境不能是激活状态,所以先退出来:
conda deactivate
conda remove --name myenv --all
conda env remove --name myenv 效果一样,加上 --dry-run 可以先看会删掉什么,不真删。
用 --prefix 建在 envs 之外的环境,比如建在某个项目文件夹里的,conda 没有名字可查,要按路径删:
conda remove --prefix ~/projects/thesis/.env --all
在访达里把环境文件夹移到废纸篓也能释放同样的文件,但用命令更干净,它会顺带更新 conda 自己的环境记录,conda env list 和 conda clean 都读这份记录。
为什么空间没回来
conda 每个包只下载一次,放进安装目录下的包缓存 pkgs,再用硬链接把这些文件链进每一个用到它的环境,conda 文档自己的说法是,多亏硬链接,环境本身几乎不占空间。硬链接是同一份磁盘数据的另一个名字,只要还有一个名字在,数据就还在。
删环境删掉的只是它那些名字,pkgs 里那份还在,所以对安装目录跑 du,数字和之前差不多。缓存里还留着下载下来的 .conda 和 .tar.bz2 压缩包,以及频道索引文件,包装好以后这些都没有环境再需要。
用 conda clean 拿回剩下的
先预览:
conda clean --all --dry-run
再真正执行:
conda clean --all
| 参数 | 删掉什么 |
|---|---|
-i, --index-cache |
下载的频道索引文件,conda 下次会重新获取 |
-t, --tarballs |
已经解压进缓存的包压缩文件 |
-p, --packages |
没有任何环境链接的已解压包 |
-c, --tempfiles |
残留的临时文件 |
-l, --logfiles |
日志文件 |
-a, --all |
以上全部 |
用 -p 之前值得看一眼 conda 文档里的提醒,它只检查 conda info --envs 列出来的环境,conda 不知道的环境,比如另一套 conda 建的、或者登记在别的用户名下的,可能会丢掉它还在链接的包。如果你有环境放在不寻常的位置,先跑一次 conda env list,确认它们都在列表里。
--force-pkgs-dirs 别碰,它会删掉所有可写的包缓存,刻意没放进 --all,会弄坏依赖这些文件的环境。
mamba 和多套安装
mamba 接受同样的命令,mamba env list、mamba remove --name myenv --all、mamba clean --all 都能用。如果装过不止一套,比如几年前的 Anaconda 加上现在的 Miniforge,每套都有自己的 envs 和 pkgs,要用各自的 conda 分别清,或者先在访达里把两个文件夹都看一眼,再判断空间去了哪。shell 里设了 CONDA_PKGS_DIRS 和 CONDA_ENVS_PATH 的话,这两个文件夹会在别的位置。
Mole 能帮什么
Mole 的「清理」会在你的个人文件夹里找 conda 安装(~/miniconda3、~/anaconda3、~/miniforge3、~/mambaforge,以及 ~/opt 下的两个),只认真正有 conda-meta 和 pkgs 文件夹的那些。在开发工具里它会列出一组 Conda Cache,有两类行,一类是 pkgs 里已经解压到位、一天内没被动过的包压缩文件,另一类是 pkgs/cache 索引文件夹,也就是 conda clean --index-cache 会删的那个。每一行都标着需确认,默认不勾选。Mole 不碰已解压的包和环境,也不运行 conda,你勾选的内容会移到废纸篓,删环境本身还是交给 conda remove。其他开发缓存可以看清理 Mac 上的开发缓存,Xcode、npm 这些都在里面。
常见问题
能手动删掉 pkgs 文件夹吗?
不要整个删。环境是硬链接到里面的文件的,conda 也要在那里找自己的记录,用 conda clean --all,它只删没有环境需要的部分。
删掉环境会删掉我的笔记本和数据吗?
只删环境文件夹里的文件,项目文件夹里的笔记本、脚本和数据都还在,除非你用 --prefix 把环境建在项目里面,又把数据放在了同一个文件夹。
能删掉 base 环境吗?
不能,conda 自己就在 base 里。想全部清掉就卸载 conda,卸载 Python 和 Node 那篇讲了。
conda clean --all 会让下次安装变慢吗?
会慢一点,conda 要重新下载索引,缓存里没有的包也要再下一次,现有的环境照常能用。