【问题标题】:Conda command to list size of packagesConda 命令列出包的大小
【发布时间】:2021-06-10 23:21:13
【问题描述】:

我想知道 conda 包的大小以删除巨大且很少使用的包。我应该使用哪个 conda 命令来找出包大小?

conda list 将列出包但不显示包大小。

我欢迎其他方法来找出包装大小。

我使用的是 Windows 10。

【问题讨论】:

  • 那么不要使用 Anaconda。从 Miniconda 或 Miniforge 重新开始,然后安装你需要的东西。

标签: anaconda conda


【解决方案1】:

挖掘 conda-meta

解决此问题的一种方法是在环境的conda-meta/ 目录中挖掘每个包的 JSON 元数据文件。列出了两种尺寸:

  • size - 压缩包的总压缩包大小
  • size_in_bytes - 包中的各个解压缩文件大小

由于您似乎对包裹的总尺寸感兴趣,所以让我们使用更简单的 size。这将使我们能够按下载大小快速对软件包进行排名。

命令

## activate the environment of interest
conda activate foo

## search all the JSONs for '"size":'
grep '"size":' ${CONDA_PREFIX}/conda-meta/*.json |\ 

  ## sort result
  sort -k3rn |\

  ## show only filename
  sed 's/.*conda-meta\///g' |\

  ## print with columns
  column -t

示例输出

jaxlib-0.1.67-py39h6e9494a_0.json:          "size":  38576847,
scipy-1.6.3-py39h056f1c0_0.json:            "size":  19495906,
python-3.9.4-h9133fd0_0_cpython.json:       "size":  13160553,
libopenblas-0.3.15-openmp_h5e1b9a4_1.json:  "size":  9163719,
numpy-1.20.3-py39h7eed0ac_1.json:           "size":  5732039,
tk-8.6.10-hb0a8c7a_1.json:                  "size":  3420669,
openssl-1.1.1k-h0d85af4_0.json:             "size":  1985060,
sqlite-3.35.5-h44b9ce1_0.json:              "size":  1810221,
libgfortran5-9.3.0-h6c81a4c_22.json:        "size":  1766473,
pip-21.1.2-pyhd8ed1ab_0.json:               "size":  1147500,
libcxx-11.1.0-habf9029_0.json:              "size":  1055976,
setuptools-49.6.0-py39h6e9494a_3.json:      "size":  972968,
ncurses-6.2-h2e338ed_4.json:                "size":  901840,
jax-0.2.14-pyhd8ed1ab_0.json:               "size":  571585,
llvm-openmp-11.1.0-hda6cdc1_1.json:         "size":  274368,
readline-8.1-h05e3726_0.json:               "size":  272444,
xz-5.2.5-haf1e3a3_1.json:                   "size":  233058,
certifi-2021.5.30-py39h6e9494a_0.json:      "size":  144599,
ca-certificates-2021.5.30-h033912b_0.json:  "size":  139088,
tzdata-2021a-he74cb21_0.json:               "size":  123802,
zlib-1.2.11-h7795811_1010.json:             "size":  104180,
absl-py-0.12.0-pyhd8ed1ab_0.json:           "size":  98565,
tqdm-4.61.0-pyhd8ed1ab_0.json:              "size":  81513,
opt_einsum-3.3.0-pyhd8ed1ab_1.json:         "size":  54494,
libffi-3.3-h046ec9c_2.json:                 "size":  46425,
wheel-0.36.2-pyhd3deb0d_0.json:             "size":  31381,
python-flatbuffers-2.0-pyhd8ed1ab_0.json:   "size":  28606,
libgfortran-5.0.0-9_3_0_h6c81a4c_22.json:   "size":  19280,
six-1.16.0-pyh6c4a22f_0.json:               "size":  14259,
libblas-3.9.0-9_openblas.json:              "size":  11762,
libcblas-3.9.0-9_openblas.json:             "size":  11671,
liblapack-3.9.0-9_openblas.json:            "size":  11671,
python_abi-3.9-1_cp39.json:                 "size":  3921,

上面的输出显示jaxlib是最大的包,其次是scipy,然后是python解释器本身。在这种情况下,如果我想删除jaxlib,也需要删除jax

注意事项

我认为以上是按大小对包裹进行排名的第一个近似值。 size_in_bytes 可能更准确,但要彻底了解,还需要考虑哪些单独的文件是硬链接的,因为这些文件实际上不应计入 每个环境 级别的包中。对于他们来说,每个系统只有一个副本,并且可以跨环境重复使用。

【讨论】:

  • 我选择了你的答案作为正确答案。对不起,我没有给你我的赏金。我无法撤消这个错误。道歉。
  • @user3848207 完全不用担心!我打算在有时间的时候写下答案,不管赏金如何。此外,即使它错过了非 Python 包,另一个答案也很漂亮。
【解决方案2】:

如果您担心会用完磁盘空间,可以运行此命令来清理 conda 用于设置环境的所有临时包、zip 文件等。

conda clean --all

这些文件仍然存在,并且随着时间的推移可能会使您的磁盘变得混乱。

使用

du -h -s $(conda info --base)/envs/test-1

对于包的文件大小

【讨论】:

    【解决方案3】:

    可以通过subprocess通信使用pip模块(Python >= 3.7):

    from pip._internal.commands.show import search_packages_info
    import subprocess
    import sys
    import json
    import pathlib
    import math
    import operator
    
    TMPL = '{:<30} {:<30} {:<10} {:>9}'
    
    
    def humanize(size):
        """Convert size in bytes to human readable output."""
        try:
            units = ['B', 'KB', 'MB', 'GB']
            i = math.floor(math.log(size) / math.log(1024))
            hsize = f"{round(size / 1024**i)}{units[i]}"
        except ValueError:
            hsize = '0B'
        return hsize
    
    
    def pip_list_ext():
        """List installed packages with additional information."""
        # python -m pip list --format --json --verbose
        pip_list = subprocess.run([sys.executable, '-m', 'pip', 'list',
                                   '--format', 'json', '--verbose'],
                                  capture_output=True)
    
        if pip_list.returncode != 0:
            raise RuntimeError('...')
    
        query = [pkg['name'] for pkg in json.loads(pip_list.stdout)]
        packages = []
        for pkg in search_packages_info(query):
            location = pathlib.Path(pkg['location'])
            pkg['installer'] = pkg.get('installer', '')
            pkg['files'] = pkg.get('files', [])
            size = sum((location / f).stat().st_size
                           for f in pkg['files'] if (location / f).is_file())
            pkg['size'] = size
            packages.append(pkg)
    
        return packages
    
    if __name__ == '__main__':
        packages = pip_list_ext()
    
        print(TMPL.format('Package', 'Version', 'Installer', 'Size'))
        print(TMPL.format('-'*30, '-'*30, '-'*10, '-'*9))
        for pkg in packages:
            print(TMPL.format(pkg['name'], pkg['version'],
                              pkg['installer'], humanize(pkg['size'])))
    
        # TOP 10
        N = 10
        pkgs = sorted(packages, key=operator.itemgetter('size'), reverse=True)
        print(f"\nTOP {N}:")
        for i, pkg in enumerate(pkgs[:N], 1):
            print(f"{i:>2}. {pkg['name']} ({humanize(pkg['size'])})")
    

    样本输出

    Package                        Version                        Installer       Size
    ------------------------------ ------------------------------ ---------- ---------
    appnope                        0.1.2                          conda           13KB
    backcall                       0.2.0                          conda           58KB
    certifi                        2021.5.30                                     261KB
    cffi                           1.14.5                         conda          780KB
    cryptography                   3.4.7                          conda            2MB
    decorator                      5.0.9                          conda           35KB
    ipython                        7.22.0                         conda            4MB
    ipython-genutils               0.2.0                          conda           66KB
    jedi                           0.17.2                         conda            5MB
    mkl-fft                        1.3.0                                            0B
    mkl-random                     1.2.1                          conda            1MB
    mkl-service                    2.3.0                                            0B
    numpy                          1.20.2                         conda           23MB
    pandas                         1.2.4                                          27MB
    parso                          0.7.0                          conda          320KB
    pexpect                        4.8.0                          conda          177KB
    pickleshare                    0.7.5                          conda           23KB
    pip                            21.1.2                                           0B
    prompt-toolkit                 3.0.17                         conda            2MB
    ptyprocess                     0.7.0                          conda           40KB
    pycparser                      2.20                           conda          547KB
    Pygments                       2.9.0                          conda            6MB
    pyOpenSSL                      20.0.1                         conda          212KB
    python-dateutil                2.8.1                          conda          619KB
    pytz                           2021.1                         conda          971KB
    setuptools                     52.0.0.post20210125                              0B
    six                            1.15.0                         conda           63KB
    traitlets                      5.0.5                          conda          798KB
    wcwidth                        0.2.5                          conda          411KB
    wheel                          0.36.2                                           0B
    
    TOP 10:
     1. pandas (27MB)
     2. numpy (23MB)
     3. Pygments (6MB)
     4. jedi (5MB)
     5. ipython (4MB)
     6. cryptography (2MB)
     7. prompt-toolkit (2MB)
     8. mkl-random (1MB)
     9. pytz (971KB)
    10. traitlets (798KB)
    

    【讨论】:

    • 这回答了 Python 包的问题,​​但不适用于 Conda 包,其中只有一部分是 Python。
    • 您有没有列出的软件包示例,我可以试试吗?
    • 大概所有那些mkl-* 包都依赖于mkl Conda 包,这个包很大。此外,只需在您的环境中使用 conda list 并将其与 pip list 进行比较。
    【解决方案4】:

    du tool 可以告诉您特定目录占用了多少磁盘空间。 例如,创建一个相同的 conda 环境(Miniconda)并检查其磁盘使用情况,如下所示:

    $ conda create -n testenv -y python numpy pandas
    
    $ du -h -s $(conda info --base)/envs/testenv
    1.2G    /opt/miniconda/envs/testenv 
    

    【讨论】:

    • 我的 envs 文件夹是空的。在这种情况下如何找到单个包装的尺寸?我使用的是 Windows 10,而不是 Linux
    【解决方案5】:

    此解决方案适用于 Windows 10。

    安装 Windows SysInternals 以便您拥有命令实用程序 du。 运行du命令查看Anaconda中site-packages下的包大小,并将结果存入csv文件。

    $ du -c -v Lib/site-packages/ > packages.csv
    

    使用 Excel 打开packages.csv。按降序对包裹大小的列进行排序。现在,您获得了有关最大包大小的包的信息。

    【讨论】:

    • 非 Python 包和 Conda Python 包的非 Python 部分怎么样?那些不会安装在那里,并且安装后的单个 Conda 包通常分布在许多文件夹中。
    • @merv,您对我的回答的不足之处提出了很好的意见。我相信我的回答专门针对提出的问题,该问题要求找出 Windows 10 上最大的 conda 包,但正如您所提到的,存在限制。在大多数情况下,我怀疑非 Python 包可能比最大的 conda python 包更大。
    • 我问了这个问题。感谢你的回答。它确实可以很好地回答我的问题。 @merv,感谢您的观察。似乎这个答案仍然可以进一步改进。如果您知道更好的方法,请修改答案。
    猜你喜欢
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2015-05-30
    • 2016-05-16
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多