Mac で conda 環境を削除して空き容量を増やす方法
データ分析の作業を数か月続けた 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 env list と conda clean が読む conda 自身の環境の記録も更新されるからです。
容量が戻らなかった理由
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 で両方のフォルダを確認してください。容量がほかの場所に移ったと思い込まないように。シェルに CONDA_PKGS_DIRS や CONDA_ENVS_PATH が設定されていれば、それらのフォルダの場所は変わります。
Mole の役割
Mole のクリーンは、ホームフォルダにある conda のインストール(~/miniconda3、~/anaconda3、~/miniforge3、~/mambaforge、~/opt 下の二つ)を探し、本物の conda-meta と pkgs フォルダがあるものだけを対象にします。開発ツールの下に Conda Cache というグループがあり、二種類の行を表示します。pkgs 内で展開済みのコピーがすでにあり、1 日以上触られていないパッケージアーカイブと、conda clean --index-cache が削除するものと同じ pkgs/cache のインデックスフォルダです。すべての行に確認と表示され、最初はチェックが外れています。Mole は展開済みのパッケージや環境には触れず、conda も実行せず、チェックした項目をゴミ箱に移します。環境そのものの削除は conda remove の仕事のままです。ほかの開発用キャッシュについては、Mac の開発キャッシュを整理するで Xcode や npm などを順に見ていきます。
よくある質問
pkgs フォルダを手動で削除しても安全ですか?
フォルダごとはだめです。環境はその中のファイルにハードリンクされていて、conda も記録がそこにあることを前提にしています。conda clean --all を使えば、どの環境にも必要ないものだけが削除されます。
環境を削除するとノートブックやデータも消えますか?
消えるのは環境フォルダの中のファイルだけです。プロジェクトフォルダ内のノートブック、スクリプト、データは残ります。ただし --prefix でプロジェクトの中に環境を作り、同じフォルダにデータを置いていた場合は別です。
base 環境は削除できますか?
できません。base には conda 自体が入っています。すべて消したい場合は conda をアンインストールします。方法は Python と Node のアンインストールガイドにあります。
conda clean --all をすると次のインストールが遅くなりますか?
少し遅くなります。conda はインデックスを再ダウンロードし、キャッシュにもうないパッケージを取得し直します。環境はそのまま動きます。