--no-cache-dir单独使用会失效,因为它仅跳过pip本地缓存写入,不减少编译过程本身的内存占用;scipy、torch等库的fortran/c++编译阶段仍会因链接器mmap、多进程争抢等导致内存溢出。

直接加 --no-cache-dir 通常不够,得配合禁依赖、换源、切 wheel、调环境变量一起上,否则编译阶段照样爆内存。
为什么 --no-cache-dir 单独用会失效
它只跳过把下载的包写进 ~/.cache/pip 或 %LOCALAPPDATA%\pip\Cache 这一步,不碰编译本身。像 scipy、torch、pyarrow 这类库,真正吃内存的是 Fortran/C++ 编译过程——临时对象堆叠、链接器 mmap 大量 .o 文件,--no-cache-dir 对这部分零影响。
- 现象:
pip install scipy卡在building 'scipy._lib._ccallback_c' extension,top看python进程 RSS 不涨但VIRT暴涨到 20GB+ - Windows 上更明显:cmd 默认栈小,
link.exe一启动就崩;建议改用 PowerShell 或显式调用python -m pip - 旧版
pip 不支持并行构建限流,多进程编译争抢内存,升级是刚需:<code>python -m pip install -U pip setuptools wheel
强制走预编译 wheel 是最快路径
绕过所有编译环节,直接解压安装二进制包,内存压力几乎为零。但得注意匹配平台和 Python 版本,否则会 fallback 回源码编译。
使用位于 ci-tools.xrow.de 的 CI Tools 组件目录构建和维护 GitLab CI/CD 流水线,适用于创建或修复 .gitlab-ci.yml 文件,选择合适的组件。
- 明确指定只装二进制:
pip install --only-binary=all --no-deps numpy scipy pandas - 若报
No matching distribution,说明 PyPI 上没对应你平台的 wheel,先查pip debug --verbose看platform_tag和abi_tag,再手动去 PyPI 文件页 下载适配的.whl - 本地已有 wheel?用
--find-links ./wheels --no-index直接装:pip install --no-cache-dir --find-links ./wheels --no-index scipy
Linux 下链接器吃 swap 的隐蔽陷阱
不是真缺物理内存,而是 ld 在符号解析时 mmap 了几十个 .o 文件,OS 用 swap 撑住,free -h 看 swap 已满,df -h 却显示磁盘空闲——这是典型假性 OOM。
- 临时缓解:导出
LDFLAGS="-Wl,--no-keep-memory"再跑pip install - 长期方案:限制构建并发数,比如
export MAX_JOBS=2(对支持setuptools.build_meta的库有效) - 别信
--memory=2000M:这个参数是实验性功能,2026 年主流 pip 版本仍不默认启用,且仅控制 pip 主进程,不管子进程编译
缓存目录配额耗尽比内存不足更常见
尤其在 PyCharm 终端、容器、学校服务器上,OSError: [Errno 122] Disk quota exceeded 或 IOError: [Errno 28] No space left on device 其实是用户配额(inode 或 block)被打满,跟物理内存无关。
- 立刻清理:
pip cache purge - 换地方缓存,避免 C 盘或受限目录:
pip config set global.cache-dir "/tmp/pip_cache"或设环境变量PIP_CACHE_DIR="/tmp/pip_cache" - CI/CD 构建中,每次运行前加
rm -rf ~/.cache/pip,比靠--no-cache-dir更彻底
真正卡住你的,往往不是内存大小,而是 pip 如何调度子进程、链接器怎么 mmap、缓存目录有没有 inode 配额、wheel 是否匹配 ABI——这些细节不显眼,但一个没对,--no-cache-dir 就只是个安慰剂。










