刪了 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
在 Finder 裡把環境資料夾丟進垃圾桶,釋放的檔案是一樣的,但還是指令比較乾淨:它也會更新 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 env list,確認它們有出現在清單裡。
不要用 --force-pkgs-dirs。它會刪除所有可寫入的套件快取,刻意不包含在 --all 裡,還會弄壞依賴這些檔案的環境。
Mamba 和其他安裝
Mamba 接受同樣的指令:mamba env list、mamba remove --name myenv --all、mamba clean --all。如果你裝了不只一個,比如好幾年前的 Anaconda 和現在的 Miniforge,每一個都有自己的 envs 和 pkgs;要用各自的 conda 去清,或是在 Finder 裡把兩個資料夾都看一遍,別急著假設空間去了別的地方。如果你的 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 環境嗎?
不行。base 裡面是 conda 本身。想全部清掉,就解除安裝 conda,Python 和 Node 的解除安裝指南有說明。
conda clean --all 會讓下次安裝變慢嗎?
會慢一點。conda 要重新下載索引,也要抓回快取裡已經沒有的套件。你的環境仍然可以照常使用。