我发现R包占用空间太多,想知道library文件夹下:每个一级子目录分别占用了多少磁盘空间?

以下分别给出 PythonR 的实现方式


一:Python(pathlib + pandas)

核心思路

  1. 使用 pathlib.Path 遍历目标路径下的 一级子目录
  2. 对每个子目录递归查找所有文件
  3. 累加文件大小(字节)
  4. 使用 pandas 整理为表格,并转换为 MB 排序

Python 代码

from pathlib import Path
import pandas as pd

path = Path(r"E:\R_Program\R-4.4.1\library")

rows = [
    {
        "package": p.name,
        "size_bytes": sum(
            f.stat().st_size
            for f in p.rglob("*")
            if f.is_file()
        )
    }
    for p in path.iterdir()
    if p.is_dir()
]

df = (
    pd.DataFrame(rows)
    .assign(size_MB=lambda x: x.size_bytes / 1024**2)
    .sort_values("size_MB", ascending=False)
)

df.head(10)

在这里插入图片描述


代码解读

1. 遍历一级目录
for p in path.iterdir() if p.is_dir()
  • iterdir():只遍历 当前路径的一级内容
  • is_dir():确保只统计文件夹(而非单个文件)

这一步保证了统计对象是 每个 R 包目录,而不是递归子目录本身。


2. 递归统计文件大小
sum(f.stat().st_size for f in p.rglob("*") if f.is_file())
  • rglob("*"):递归获取目录下的所有内容
  • f.is_file():只统计文件,排除子目录
  • f.stat().st_size:返回文件大小(字节)

这是 Python 版本的核心计算逻辑。


3. 使用 pandas 进行整理
.assign(size_MB=lambda x: x.size_bytes / 1024**2)
.sort_values("size_MB", ascending=False)
  • 字节 → MB
  • 按大小降序排列
  • 非常适合后续筛选“最占空间的包”

二:R(base R)

核心思路

  1. 使用 list.dirs() 获取一级子目录
  2. 对每个子目录:
    • 列出所有文件
    • 使用 file.info() 获取大小
    • 累加并转换为 MB
  3. 整理为 data.frame

R 代码

path <- "E:/R_Program/R-4.4.1/library"

# 只取一级目录
libs <- list.dirs(
  path,
  recursive = FALSE,
  full.names = TRUE
)

# 计算每个包目录的总大小(MB)
lib_size <- sapply(libs, function(d) {
  files <- list.files(
    d,
    recursive = TRUE,
    full.names = TRUE
  )
  sum(file.info(files)$size, na.rm = TRUE) / 1024^2
})

res <- data.frame(
  pak = libs,
  size_MB = lib_size
)

head(res,10)

在这里插入图片描述


代码解读

1. 获取一级目录
list.dirs(path, recursive = FALSE, full.names = TRUE)
  • recursive = FALSE:只返回一级子目录
  • full.names = TRUE:保留完整路径,便于后续文件访问

这一步与 Python 中 path.iterdir() 的作用完全对应。


2. 递归列出文件并统计大小
files <- list.files(d, recursive = TRUE, full.names = TRUE)
sum(file.info(files)$size, na.rm = TRUE)
  • list.files(..., recursive = TRUE):获取目录下所有文件
  • file.info(files)$size:返回文件大小(字节)
  • na.rm = TRUE:防止权限或软链接导致的 NA 中断

3. 转换为 MB
/ 1024^2

保持与 Python 结果单位一致,便于对照。


R 方法特点

  • 纯 base R,无需额外依赖
  • 对 R 用户直观
  • 适合直接嵌入分析脚本或维护脚本中

Python 与 R 实现对比

方面 Python R
路径处理 pathlib 面向对象 字符串 + base 函数
递归方式 rglob("*") list.files(recursive=TRUE)
表格整理 pandas data.frame
扩展性 强(可直接可视化/导出) 简洁,依赖少
适用场景 跨语言/数据工程 R 环境维护

实践注意事项

  • R library 中可能包含:
    • 二进制文件(.dll, .so
    • 编译缓存
    • vignette / help 文档
      因此某些包(如 rstan, terra, Seurat)体积明显偏大是正常现象。
  • Windows 路径建议统一使用:
    • Python:Path(r"...")
    • R:正斜杠 / 或双反斜杠 \\
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐