Как стать автором
Обновить
419.42
BotHub
Агрегатор нейросетей: ChatGPT, Claude, Midjourney

Как не дать Conda заполнить ваш жесткий диск

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров3.1K
Автор оригинала: Lee Vaughan
Anaconda поедает жёсткий диск (сгенерировано DALL-E)
Anaconda поедает жёсткий диск (сгенерировано DALL-E)

Если вы используете Anaconda, то наверняка знаете, что conda-среды помогают управлять зависимостями пакетов, избегать конфликтов совместимости и делиться своими проектами с другими. К сожалению, эти среды могут занять большое пространство на жёстком диске вашего компьютера.

Я пишу много учебных материалов по программированию, и чтобы поддерживать их в порядке, для каждого проекта создаю отдельную структуру папок с выделенной conda-средой. Поначалу это работало прекрасно, но вскоре производительность компьютера начала ухудшаться, и я заметил, что мой SSD начал заполняться. В какой-то момент у меня осталось всего 13 ГБ свободного места.

Использование памяти на диске C (от автора)
Использование памяти на диске C (от автора)

Conda решает такую проблему, сохраняя все загруженные файлы пакетов в едином «кэше» (pkgs_dirs). При установке пакета conda сначала проверяет, есть ли он в этом кэше, и загружает только в случае отсутствия. Если пакет не найден, conda скачивает его, распаковывает и связывает файлы с активной средой. Благодаря общему кэшу, разные среды могут использовать одни и те же файлы пакетов без их дублирования.

Однако conda кэширует каждый загруженный пакет, из-за чего папка pkgs_dirs может занимать много гигабайт. И хотя conda использует общие пакеты из кэша, некоторые файлы всё равно нужно хранить в папке среды. Это необходимо, чтобы избежать конфликтов версий, когда разные среды требуют разные версии одной и той же зависимости (пакета, который нужен для работы другого пакета).

Кроме того, крупные скомпилированные двоичные файлы, такие как OpenCV, могут потребовать полных копий в директории среды, а каждая среда нуждается в собственной копии интерпретатора Python, объёмом от 100 до 200 МБ. Все факторы могут привести к тому, что conda-среды разрастутся до нескольких гигабайт.

В рамках этого проекта под названием “Quick Success Data Science” мы рассмотрим несколько методов, позволяющих уменьшить требования к объёму памяти, необходимому для хранения conda-сред. Это касается как сред, хранящихся в стандартных местах по умолчанию, так и в специально выделенных каталогах.

Ниже приведены несколько техник управления памятью, которые помогут вам сократить объём памяти, занимаемой conda на вашем устройстве. Мы подробно обсудим каждую из них. 

1. Очистка кэша 

2. Совместное использование сред, основанных на задачах 

3. Архивирование с использованием файлов среды и спецификаций 

4. Архивирование сред с помощью conda-pack

5. Хранение сред на внешнем диске

6. Перемещение кэша пакетов 

7. Использование виртуальных сред (venv)

1. Очистка кэша пакетов

Очистка кэша пакетов — первый и самый простой шаг для освобождения памяти. Даже после удаления сред conda сохраняет связанные с ними файлы пакетов в кэше. Вы можете освободить место, удалив эти неиспользуемые пакеты и их сжатые файлы (tarballs), журналы, индексы кэша (метаданные, сохранённые в conda) и временные файлы.

Conda позволяет сначала выполнить так называемую “сухую проверку”, чтобы увидеть, сколько памяти будет освобождено. Можете сделать это в терминале или через Anaconda Prompt в основной (base) среде:

conda clean --all --dry-run

Чтобы подтвердить действия и освободить память, выполните:

conda clean --all

Вот как это выглядело на моем устройстве:

Команда Conda dry run и clean в Anaconda Prompt (от автора)
Команда Conda dry run и clean в Anaconda Prompt (от автора)

Процесс освободил внушительные 6.28 ГБ и занял всего несколько минут.

2. Совместное использование сред, основанных на задачах

Создание нескольких сред для специализированных задач — например, компьютерного зрения или геопространственных вычислений — экономит больше памяти, чем создание отдельных сред для каждого проекта. Такие среды будут включать базовые пакеты, а также те, которые необходимы для выполнения конкретной задачи (например, OpenCV, scikit-image и PIL для работы с компьютерным зрением).

Преимущество такого подхода в том, что вы можете легко поддерживать все пакеты в актуальном состоянии и использовать одни и те же среды для нескольких проектов. Однако этот метод не подходит, если для разных проектов требуются различные версии одних и тех же пакетов. 

3. Архивирование с использованием файлов среды и спецификаций

Если у вас недостаточно места для хранения или вы хотите сохранить старые проекты, подумайте об использовании файлов среды или спецификаций. Эти небольшие файлы содержат информацию о содержимом среды, позволяя восстановить её позже.

Сохранение среды conda таким образом уменьшает её размер на диске с гигабайт до нескольких килобайт. Конечно, для использования сохраненной среды её придётся восстанавливать. Поэтому этот метод не рекомендуется, если вы часто возвращаетесь к проектам, связанным с архивированными средами.

Примечание: Рассмотрите возможность использования Mamba, замены для conda, которая работает быстрее. Как указано в документации, “Если вы знаете conda, то знаете и Mamba!”

Использование файлов среды: Файл среды — небольшой файл, который перечисляет все установленные пакеты и их версии в среде, включая те, которые были установлены с помощью пакетного менеджера Python (pip). Этот файл помогает как восстановить среду, так и поделиться ей с другими.

Файл среды записывается в формате YAML (.yml), формате сериализации данных, который удобен для хранения данных. Чтобы создать такой файл, нужно активировать среду и экспортировать её. Вот как можно создать файл для среды с именем my_env:

conda activate my_env

conda env export > my_env.yml

Вы можете назвать файл любым допустимым именем, но будьте осторожны: если существует файл с таким же именем, он будет перезаписан.

По умолчанию файл среды сохраняется в директорию пользователя. Вот сокращенный пример содержимого файла:

name: C:\Users\hanna\quick_success\fed_hikes\fed_env channels: - defaults - conda-forge dependencies: - asttokens=2.0.5=pyhd3eb1b0_0 - backcall=0.2.0=pyhd3eb1b0_0 - blas=1.0=mkl - bottleneck=1.3.4=py310h9128911_0 - brotli=1.0.9=ha925a31_2 - bzip2=1.0.8=he774522_0 - ca-certificates=2022.4.26=haa95532_0 - certifi=2022.5.18.1=py310haa95532_0 - colorama=0.4.4=pyhd3eb1b0_0 - cycler=0.11.0=pyhd3eb1b0_0 - debugpy=1.5.1=py310hd77b12b_0 - decorator=5.1.1=pyhd3eb1b0_0 - entrypoints=0.4=py310haa95532_0 ------SNIP------

Теперь вы можете удалить conda-среду и воссоздать её с помощью этого файла. Чтобы удалить среду, сначала деактивируйте её, а затем выполните команду remove (где ENVNAME — это имя вашей среды):

conda deactivate

conda remove -n ENVNAME --all

Если ваша conda-среда находится вне папки envs по умолчанию, используемой Anaconda, укажите путь к каталогу среды следующим образом:

conda remove -p PATH\ENVNAME --all

Учтите, что этот метод архивирования будет работать идеально, только если вы продолжите использовать ту же операционную систему, например, Windows или macOS. Это связано с тем, что при решении зависимостей могут быть добавлены пакеты, которые не будут совместимы на других платформах.

Чтобы восстановить conda-среду с использованием файла, выполните следующую команду, где my_env — это имя вашей conda-среды, а environment.yml — файл, содержащий её настройки:

conda env create -n my_env -f \directory\path\to\environment.yml

Вы также можете использовать файл среды для её воссоздания на вашем диске D:. Просто укажите новый путь при использовании файла. Вот пример:

conda create --prefix D:\my_envs\my_new_env --file environment.yml

Для получения дополнительной информации о файлах сред, включая способы их ручного создания, обратитесь к документации.

Использование файлов спецификаций: Если вы не устанавливали никаких пакетов с помощью pip, вы можете использовать файл спецификаций, чтобы воспроизвести conda-среду на той же операционной системе. Чтобы создать файл спецификаций, активируйте среду, например, my_env, и введите следующую команду:

conda list --explicit > exp_spec_list.txt

Это создаст следующий результат (сокращённый):

# This file may be used to create an environment using: # $ conda create --name <env> --file <this file> # platform: win-64 @EXPLICIT https://conda.anaconda.org/conda-forge/win-64/ca-certificates-202x.xx.x-h5b45459_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/tzdata-202xx-he74cb21_0.tar.bz2 ------snip------

Учтите, что --explicit гарантирует, что целевая платформа будет указана в файле. В данном случае это выглядит как # platform: win-64 на третьей строке.

Теперь вы можете удалить среду, как описано в предыдущем разделе. Чтобы воссоздать среду my_env, используя этот текстовый файл, выполните следующую команду с указанием корректного пути к каталогу:

conda create -n my_env -f \directory\path\to\exp_spec_list.txt

4. Архивирование сред с помощью conda-pack

Команда conda-pack позволяет архивировать conda-среду перед её удалением. Она упаковывает всю среду в сжатый архив с расширением .tar.gz. Это удобно для резервного копирования, обмена и перемещения сред без необходимости переустанавливать пакеты.

Следующая команда сохранит среду, но удалит её с вашей системы (где my_env — это имя вашей среды):

conda install -c conda-forge conda-pack

conda pack -n my_env -o my_env.tar.gz

Чтобы восстановить среду позже, выполните команду:

mkdir my_env && tar -xzf my_env.tar.gz -C my_env

Такой метод не сэкономит столько памяти, как текстовый файл, однако при восстановлении среды не потребуется заново скачивать пакеты, что позволяет использовать его без подключения к интернету.

5. Хранение сред на внешнем накопителе

По умолчанию conda хранит все среды в стандартном расположении. В Windows это папка …\anaconda3\envs. Вы можете просмотреть эти среды, выполнив команду conda info --envs в окне командной строки или терминала. Вот как это выглядит на моем диске C: (здесь представлен сокращенный список):

Сокращенный список conda-сред на моем диске C:\ (от автора)
Сокращенный список conda-сред на моем диске C:\ (от автора)

Использование одной папки для всех сред: Если на вашем компьютере есть внешний или второй диск, вы можете настроить conda на хранение сред на этом диске, чтобы освободить место на основном. Для этого используйте следующую команду, подставив свой путь:

conda config --set envs_dirs /путь/к/внешнему/диску

Например, если указать путь к диску D, как D:\conda_envs, conda будет создавать новые среды в этой папке.

Этот метод отлично подходит, если ваш внешний диск — быстрый SSD, и вы храните пакеты с большими зависимостями, такие как TensorFlow. Однако у него есть недостатки в виде замедления работы. Если операционная система и блокноты остаются на основном диске, вы можете столкнуться с задержками чтения/записи при выполнении Python.

Кроме того, некоторые настройки ОС могут отключать неактивные внешние диски, что добавляет задержку при их повторном запуске. Инструменты вроде Jupyter могут испытывать трудности с поиском сред conda, если изменяется буква диска, поэтому лучше использовать фиксированную букву диска и убедиться, что пути к ядрам настроены правильно.

Использование нескольких папок для сред: Вместо использования одной папки envs_dirs для всех сред, вы можете хранить каждую среду в соответствующей папке проекта. Это позволяет держать все, что связано с проектом, в одном месте.

Пример структуры файлов проекта с встроенной (1,7 ГБ) conda-средой (opencv_env), (от автора)
Пример структуры файлов проекта с встроенной (1,7 ГБ) conda-средой (opencv_env), (от автора)

Например, предположим, что у вас есть проект на диске D: в папке под названием D:\projects\geospatial. Чтобы разместить conda-среду проекта в этой папке, загруженную с пакетом ipykernel для JupyterLab, выполните следующую команду:

conda create -p D:\projects\geospatial\env ipykernel

Конечно, вы можете назвать среду не просто env, а чем-то более осмысленным, например, geospatial_env.

Как и в предыдущем примере, хранение сред на другом диске может вызвать проблемы с производительностью.

Особое примечание по JupyterLab: В зависимости от того, как вы запускаете JupyterLab, его поведение по умолчанию может заключаться в том, чтобы открываться в вашей пользовательской директории (например, C:\Users\your_user_name). Поскольку файловый браузер ограничен директорией, из которой запущен JupyterLab, вы не увидите директории на других дисках, таких как D:\. Существует множество способов решения этой проблемы, но один из самых простых — запуск JupyterLab с диска D.

Например, в Anaconda Prompt введите:

D:

Затем выполните команду:

jupyter lab

Теперь вы сможете выбирать ядра на диске D.

Для получения дополнительных вариантов изменения рабочей директории JupyterLab, вы можете обратиться к AI с вопросами: «как изменить рабочую директорию по умолчанию в Jupyter» или «как создать символическую ссылку на D:\ в пользовательской папке».

Перемещение существующих сред: Никогда не следует перемещать conda-среду вручную, например, вырезать и вставлять её в новое место. Это связано с тем, что conda использует внутренние пути и метаданные, которые могут стать недействительными при изменении местоположения.

Вместо этого вы можете клонировать существующие среды на другой диск. Это создаст дубликат среды, и вам нужно будет вручную удалить её из исходного места.

В следующем примере мы используем --clone, чтобы создать точную копию среды с диска C (названной my_env) на диске D:

conda create -p D:\new_envs\my_env --clone C:\path\to\old\env

Примечание: перед клонированием рекомендуется экспортировать вашу среду в файл YAML (как описано в разделе 3 выше). Это позволит вам восстановить среду, если что-то пойдёт не так в процессе клонирования.

Теперь, когда вы выполните команду conda env list, вы увидите среду, перечисленную как на диске C, так и на диске D. Вы можете удалить старую среду, выполнив следующую команду в базовой среде:

conda remove --name my_env --all -y

Опять же, проблемы с задержкой могут возникнуть, если вы работаете с двумя дисками одновременно.

Вы, возможно, задаётесь вопросом, что лучше — переместить conda-среду с помощью файла среды (YAML) или с использованием --clone? Краткий ответ: --clone — это лучший и самый быстрый вариант для перемещения среды на другой диск на том же компьютере. Файл среды лучше подходит для воссоздания той же среды на другом компьютере. Хотя файл среды гарантирует консистентность среды на разных системах, его выполнение может занять значительно больше времени, особенно для больших сред.

6. Перемещение кэша пакетов

Если на вашем основном диске мало места, вы можете переместить кэш пакетов на более объёмный внешний или второй диск с помощью следующей команды:

conda config --set pkgs_dirs D:\conda_pkgs

В этом примере пакеты теперь будут храниться на диске D (в папке D:\conda_pkgs) вместо стандартного места.

Если вы работаете на основном диске и оба диска — SSD, то проблемы с задержкой не должны быть значительными. Однако если один из дисков — медленный HDD, вы можете столкнуться с замедлением при создании или обновлении сред. Если диск D является внешним и подключён через USB, вы можете заметить значительное замедление для больших сред.

Вы можете частично решить эти проблемы, сохранив кэш пакетов (pkgs_dirs) и часто используемые среды на более быстром SSD, а другие среды — на более медленном HDD.

Ещё один важный момент — резервные копии. Основные диски могут иметь запланированные резервные копии, но вторичные или внешние диски — нет. Они подвергают вас риску потери всех ваших сред.

7. Использование виртуальных сред

Если вашему проекту не требуется обширная система управления пакетами conda для работы с тяжёлыми зависимостями (например, TensorFlow или GDAL), вы можете значительно сократить использование диска с помощью виртуальной среды Python (venv). Это лёгкая альтернатива среде conda.

Чтобы создать виртуальную среду venv с именем my_env, выполните следующую команду:

python -m venv my_env

Этот тип среды имеет небольшую базовую установку. Минимальная среда conda занимает около 200 МБ и включает несколько утилит, таких как conda, pip, setuptools и другие. Виртуальная среда venv намного легче и имеет минимальный размер установки всего 5–10 МБ.

Кроме того, conda сохраняет файлы пакетов в директории pkgs_dirs, такие файлы могут вырасти до нескольких гигабайт со временем. Поскольку venv устанавливает пакеты прямо в среду, дополнительные копии не сохраняются.

Как правило, имеет смысл использовать venv, когда вам нужны только основные пакеты Python, такие как NumPy, pandas или Scikit-learn. Пакеты, для которых strongly рекомендована conda, такие как Geopandas, всё ещё следует устанавливать в среде conda. Если вы используете много сред, скорее всего, лучше остаться на conda и воспользоваться преимуществами её системы линковки пакетов.

Вы можете найти подробности о том, как активировать и использовать виртуальные среды Python в документации по venv.

Подводим итог:

Наиболее эффективные и менее разрушительные методы управления памятью для сред conda включают очистку кэша пакетов и хранение редко используемых сред в виде YAML или текстовых файлов. Эти методы позволяют сэкономить гигабайты памяти, сохраняя при этом структуру каталогов по умолчанию в Anaconda.

Другие эффективные методы включают перемещение кэша пакетов и/или conda-сред на вторичный или внешний диск. Это решит проблемы с памятью, но может вызвать задержки, особенно если новый диск медленный (HDD) или подключён через USB.

Для простых сред можно использовать виртуальную среду Python (venv) как лёгкую альтернативу conda.

Теги:
Хабы:
+11
Комментарии2

Публикации

Информация

Сайт
bothub.chat
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия