作者:生信宝典 | 生信宝典公众号
原文:https://mp.weixin.qq.com/s/OkOgN4j44MHNt1_noPVpzA

Conda 为什么越来越慢?

Conda 中包含的软件越来越多,而且软件的不同版本都保留了下来,软件的索引文件越来越大,安装一个新软件时搜索满足环境中所有软件依赖的软件的搜索空间也会越来越大,导致solving environment越来越慢。

Conda 是如何工作的?

  1. 从设定的通道(channel)处下载通道中所有软件的索引信息(repodata.json)(Collecting package metadata (repodata.json))。
"packages" : {
 "moto-1.3.7-py_0.tar.bz2" : {
   "build" : "py_0",
   "build_number" : 0,
   "depends" : [ "aws-xray-sdk !=0.96,>=0.93", "backports.tempfile", "boto >=2.36.0", "boto3 >=1.6.15", "botocore >=1.12.13", "cookies", "dicttoxml", "docker-py", "flask", "jinja2 >=2.7.3", "jsondiff 1.1.1.*", "mock", "pyaml", "python", "python-dateutil", "python-jose <3.0.0", "pytz", "requests >=2.5", "responses >=0.9.0", "six", "werkzeug", "xmltodict" ],
   "license" : "Apache-2.0",
   "md5" : "17b424658cd07e678b5feebdc932eb52",
   "name" : "moto",
   "sha256" : "5924666f8c1758472dc4c3d22b270b46cd1c4b66c50a9ba50d5c636d2237bdd1",
   "size" : 399973,
   "subdir" : "noarch",
   "timestamp" : 1552438392680,
   "version" : "1.3.7"
 }
}


解析repodata中的信息获取所有依赖的包的信息。

采用SAT-solver算法决定需要下载包的哪个版本和它们的安装顺序。

下载并安装包。

Conda 哪一步慢?

主要是第3步,确定待安装包的依赖包之间的兼容和已安装软件之间的兼容,获得需要下载的包和对应版本。

如何提速 Conda?

  • 采用最新版的conda(Conda-4.7相比 Conda-4.6 提速 3.5 倍,Conda-4.8 应该不会比 4.7 慢)。

  • 安装时指定版本减少搜索空间conda install python=3.7.4

  • 安装 R 包时指定 R 的版本也会极大减小搜索空间(R 包因其数目众多,也是生物类软件依赖解析较慢的原因之一),例如:conda install r-base=4.0.2 r-ggplot2=3.3.2

  • 采用 mamba加速软件依赖解析 [ mamba采用 c++ 重写了部分解析过程,这个提速效果是很明显的] (安装好 mamba后就可以用 mamba替换 conda进行安装了)。
conda install mamba -c conda-forge
mamba install python=3.7.4

默认 conda 解析软件依赖时优先考虑允许的最高版本,设置通道优先级权限高于软件版本新旧后,conda 会能更快的解决依赖关系,避免 defaults 和 conda-forge 通道的奇怪组合导致软件依赖解析迟迟不能将结束的问题:conda config --set channel_priority strict(这个命令只需要运行一次)。

创建一个新环境(conda env create -n env_name)再安装软件,这样就不用考虑与已有的软件的兼容问题了,也可以大大降低搜索空间和提高解析软件依赖的速度。

如果安装的软件提供了 environment.yaml 那么用起来,文件中对应的软件版本都很明确,解析依赖关系时更快(具体导出方式见《
Bioconda 软件安装神器:多版本并存、环境复制、环境导出》)。

channels:
 - qiime2/label/r2020.6
 - conda-forge
 - bioconda
 - defaults
dependencies:
 - _libgcc_mutex=0.1
 - _openmp_mutex=4.5
 - _r-mutex=1.0.1
 - alsa-lib=1.1.5
 - arb-bio-tools=6.0.6
 - attrs=19.3.0
 - backcall=0.2.0
 - bibtexparser=1.1.0
 - binutils_impl_linux-64=2.34
 - binutils_linux-64=2.34
 - bioconductor-biobase=2.42.0
 - bioconductor-biocgenerics=0.28.0
 - bioconductor-biocparallel=1.16.6
 - bioconductor-biostrings=2.50.2
 - bioconductor-dada2=1.10.0





添加 bioconda 通道时,注意顺序,给予 conda-forge 最高优先级,其次是 bioconda。
如果之前已经添加好了通道,自己在
~/.condarc
中调整顺序。

conda config --add channels defaults
conda config --add channels bioconda
conda config --add channels conda-forge


综合以上组合,之前尝试多次都没安装好的工具,直接搞定。

下载提速

  1. 国内镜像,见《软件安装不上,可能是网速慢!Conda/R/pip/brew 等国内镜像大全拿走不谢》。

  2. 换个网或从朋友处拷贝已经下载好的压缩包一般在 anaconda_root_dir/pkgs 下,拷贝放在自己的 anaconda3/pkgs 下面,再次下载时系统会识别已经下载好的包而跳过(并不总是有效)。

  3. 获取所有相关包的名字,从朋友处拷贝下载好的安装包。如果拷贝过来未能自动识别,可手动安装 conda install --offline local_path
mamba install r-base=4.0.2 r-ggplot2=3.3.2 --dry-run >package_solving_result

# _anaconda_depends pkgs/main/linux-64::_anaconda_depends-2020.07-py37_0
# _r-mutex conda-forge/noarch::_r-mutex-1.0.1-anacondar_1
# binutils_impl_lin~ pkgs/main/linux-64::binutils_impl_linux-64-2.33.1-he6710b0_7
# binutils_linux-64 conda-forge/linux-64::binutils_linux-64-2.33.1-h9595d00_17
# brotlipy conda-forge/linux-64::brotlipy-0.7.0-py37h516909a_1000
# bwidget conda-forge/linux-64::bwidget-1.9.14-0
# gcc_impl_linux-64 pkgs/main/linux-64::gcc_impl_linux-64-7.3.0-habb00fd_1
# gcc_linux-64 conda-forge/linux-64::gcc_linux-64-7.3.0-h553295d_17

# 获取所有包的名字
grep '::' a | sed 's/.*:://' | sed 's/$/.tar.bz2/'

# 手动安装
for i in `grep '::' a | sed 's/.*:://' | sed 's/$/.tar.bz2/'`; do conda install --offline /anaconda3/pkgs/$i; done


使用 conda-pack 直接从已经安装好的地方拷贝一份

安装
conda-pack


conda install -c conda-forge conda-pack
# pip install git+https://github.com/conda/conda-pack.git

打包已经安装好的环境:

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

拷贝打包好的环境 my_env_name.tar.gz 到目标机器,并解压到任何目录,一般推荐放到 envs 目录下(anaconda_root/envs,注意:anaconda_root 改为自己的 conda安装路径)。


# 解压打包好的环境
# 默认是全都解压到当前目录,场面很壮观
# -C 一定要指定
mkdir -p anaconda_root/envs/my_env
tar -xzf my_env.tar.gz -C anaconda_root/envs/my_env

# 激活环境
source my_env/bin/activate

# Unpack
conda-unpack

# 至此环境就完全拷贝过来了

# 去激活
source deactivate

目前在同样的操作系统(CentOS)测试可以通过,不同操作系统如 centos-ubuntu 尚未测试,各位可以测试下提供下反馈。

参考资料

  1. msarahan,《How We Made Conda Faster in 4.7》,Anaconda

  2. bgruening, msarahan, etc.《Conda solver slowdown FAQ and recommendations》,GitHub Issue

  3. Wolf Vollprecht, Johan Mabille, etc.《GitHub: TheSnakePit/mamba》,GitHub

  4. Marius van Niekerk,《conda-metachannel》,Medium

  5. Anaconda Team,《Understanding and Improving Conda's performance》,Anaconda

  6. 生信宝典,《Conda 软件安装 core dump error/Segment fault/段错误 怎么办?》,生信宝典公众号

  7. 生信宝典,《软件安装不上,可能是网速慢!Conda/R/pip/brew 等国内镜像大全拿走不谢》,生信宝典公众号

  8. 陈同,《用了 Docker,妈妈再也不担心我的软件安装了 - 基础篇》,生信宝典公众号

  9. 陈同,《Linux 学习 - 又双叒叕一个软件安装方法》,生信宝典公众号

  10. Jim Crist,《conda-pack: A tool for packaging and distributing conda environments》,Conda-Pack

  11. 封面来源于 Free Image on Pixabay - Motivational Quote, Try And Stop Me.

猜您喜欢 往期精选▼

1. 让你的 conda “回滚”到以前版本的环境

2. 拒绝conda, 用virtualenv构建多版本的python开发环境

3. Anaconda 使用的一些体验与困惑

4. 使用 conda 和 Jupyter 在 R 中实现数据科学分析

5. 使用 conda 和 Jupyter 创建你的自定义 R 包,转换笔记为幻灯片

本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Conda 为什么越来越慢?的更多相关文章

  1. 用conda管理Python包

    用conda管理Python包 conda是一个很好的包管理工具,在用了Anaconda之后一直不知道怎么用conda进行管理,其实很简单,就是没人教,慢慢自己摸索了一点.直接在Anaconda的命令 ...

  2. conda管理包

    清理 conda clean --lock --tarball --package (安装包) 安装或更新包 conda install numpy=1.9.3 conda update numpy= ...

  3. (数据科学学习手札94)QGIS+Conda+jupyter玩转Python GIS

    本文完整代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 QGIS随着近些年的发展,得益于其开源免费 ...

  4. 来,一起让我们越来越懒,面向CSS、JS未来编程。(9.28已更新)

    2016.10.29更新 本文存在大量的错误,仅供参考. 不知不觉在前端领域马上一个年头就要过去了,然而再看看自己的代码,果然够烂,那么为什么代码一直没有用面向对象的思维去写CSS呢?首先有两点:一点 ...

  5. 怎样用conda安装opencv

    首先用Anaconda是因为方便(管理方便,包安装真心不方便).下面是我的安装过程: 首先使用如下命令安装opencv conda install -c https://conda.binstar.o ...

  6. conda安装包

    前面讲了有关conda改变镜像提高安装速度,这里来解决很多实用C写的酷,在Windows下不好安装的解决方案 1. 寻找wheel预编译文件 没有的话 2.使用conda命令安装 没有该包的话 3.实 ...

  7. 更改conda安装源镜像

    为了更好安装包需要制定conda安装包所使用的镜像为中国的镜像,目前为止只有一家提供了镜像 执行conda命令: conda config 会创建conda的配置文件,使用search everyth ...

  8. vs2010/2013项目的C++所在文件夹越来越大如何解决?

    vs2010/2013项目所在文件夹越来越大如何解决? Tools->Options->Text Editor->C/C++->Advanced,在 Fallback Loca ...

  9. ubuntu和windows上pip和windows上conda国内源更新module

    ubuntu上: -i http://pypi.douban.com/simple --trusted-host pypi.douban.com # pip install web.py -i htt ...

  10. How to fix the conflict between ROS Python and Conda

    Problem: Ever since I have installed Conda, ROS does not seem to work. And predictably it is because ...

随机推荐

  1. CSS 高阶小技巧 - 角向渐变的妙用!

    本文将介绍一个角向渐变的一个非常有意思的小技巧! 我们尝试使用 CSS 绘制如下图形: 在之前,类似的图案,其实我们有尝试过,在 单标签实现复杂的棋盘布局 一文中,我们用单标签实现了这样一个棋盘布局: ...

  2. 使用 zeromq与cppzmq 程序退出遇到的坑

    在使用zeromq 退出的时候还遇到一点坑,对于服务deaman(守护进程)化的进程可能会遇到这个问题. 现象: 这个问题导致的现象是服务一旦关闭(stop),就会 core dump,core du ...

  3. Rainbond的 Gateway API 插件制作实践

    Gateway API 作为新一代的流量管理标准,对原有 Ingress 的扩展不规范.移植性差等问题做出了改进.从兼容K8s生态和优化网关体验出发,Rainbond 支持以插件的形式扩展平台网关能力 ...

  4. 计网学习笔记六 Network Layer Overview

    这节课开始进入了网络层的学习,讲述了网络层提供的功能,还有路由器内部是什么样子的,以及virtual circuit网络和datagram网络的一点比较. 网络层有什么作用呢?用一句话来说,就是需要负 ...

  5. 每日复习------main()方法以及对象的初始化顺序

    由于 Java 虚拟机需要调用类的 main()方法,所以该方法的访问权限必须是 public,又因为 Java 虚拟机在执行 main()方法时不必创建对象,所以该方法必须是 static 的,该方 ...

  6. win32print常用函数

    这里整理下win32print的API介绍,官网地址http://timgolden.me.uk/pywin32-docs/win32print.html OpenPrinter 打开指定的打印机,并 ...

  7. Restless API 与 Restful API

    Restful  API: 1.CURD(增删改查) 由请求方式决定 2.请求方式有:get/post/delete/put 3.同一个路径可以进行多个操作 Restless API 1.CURD(增 ...

  8. PRINCE2核心知识点整理

    前言 PRINCE2,即 PRoject IN Controlled Environment(受控环境中的项目)是一种结构化的项目管理方法论,由英国政府内阁商务部(OGC)推出,是英国项目管理标准. ...

  9. Java中「Future」接口详解

    目录 一.背景 二.Future接口 1.入门案例 2.Future接口 三.CompletableFuture类 1.基础说明 2.核心方法 2.1 实例方法 2.2 计算方法 2.3 结果获取方法 ...

  10. APISIX Ingress 如何使用 Cert Manager 管理证书

    Apache APISIX Ingress Controller 是一款以 Apache APISIX 作为数据面的 Kubernetes Ingress Controller 开源工具,目前已经更新 ...