pythonanacondacondavirtual-environment

Conda takes 20+ minutes to solve environment when package is already installed


When I type try to run conda update -n base conda, conda hung for around 20-minutes on 'Solving environment' and then returned a package plan that did not include an updated version of conda. The package plan that was returned is provided below.

NOTE: conda update --all solved the environment in a reasonable amount of time (~1 min - I didn't time it precisely).

Steps to Reproduce

conda update -n base conda

As I mentioned above, conda install websocket-client also hung at 'Solving environment' - I already had websocket-client version 0.53.0 installed when I tried to run the install command

Expected Behavior

Conda should either:

  1. If the most recent version is installed, conda should promptly inform the user that an update isn't needed.
  2. If a newer version is available, I'd expect Conda to solve the environment in a shorter period of time. I think that less than 1-2 minutes would be reasonable - 20+ minutes is too long

Originally posted here: https://github.com/conda/conda/issues/7938


Solution

  • A Common Problem: Suboptimal Channel Prioritization

    Anaconda distribution is designed and tested to use the anaconda channel (a subset of defaults) as its primary channel. Adding conda-forge in either a higher- (channel_priority: strict) or equal-priority (channel_priority: flexible) configuration opens up many of the packages to be sourced from Conda Forge instead, and this is where Conda struggles to solve.

    Including conda-forge both expands the search as well as opens other packages to be subject to channel switching, and since the anaconda package includes dozens of packages, this can be a huge satisfiability problem to solve. This is often most problematic after the first time conda-forge is added into a user's configuration.

    Solutions

    There are two high-level ways to improve performance: simplify the solving problem or use a faster solver. Of course, these are not mutually exclusive - feel free to be both thoughtful about what you demand of your solver and adopt optimized tools.

    Option 1: Optimize Channel Prioritization

    When the anaconda metapackage is installed in an environment, keep the defaults channel at highest priority (first channel in .condarc) and set channel_priority: strict. See the documentation on Managing Channels.

    Additionally, one can forcefully prioritize the defaults channel with commands like

    conda update -n base --override-channels -c defaults conda
    

    Option 2: Mamba

    Update: This option is mostly obsolete. Beginning with Conda v23.11, the libmamba solver is now default in conda, so unless an older Conda is being run, conda and mamba should have similar performance.

    Mamba is a drop-in replacement for the conda CLI that is faster (compiled) and in my experience tends to be more aggressive in pruning. Once installed, it runs similar to conda, e.g.,

    mamba update -n base conda
    

    Note on Alternative Configuration

    Many users find the coupling of their environment management infrastructure (Conda) to a large working environment (Anaconda) to be less than ideal. A popular alternative configuration is to maintain a minimal base environment, and if Anaconda is ever needed, to create a new environment with the anaconda package installed.

    Alternative options for base environments include