You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python解压超内存8GB CSV文件报错:Errno 28 设备无剩余空间

解决8GB内存机器上解压大CSV压缩包的内存报错问题

Hey there, let's figure out why your unzipping code is throwing errors and fix it up!

问题根源

你的机器只有8GB内存,而要解压的压缩包就有8GB——解压后的CSV文件体积肯定远大于这个数值。shutil.copyfileobj()默认会使用较大的缓冲区,试图一次性把大段文件内容加载到内存里,这直接超出了你机器的内存承载能力,大概率是导致报错的核心原因(虽然你的报错栈没贴全,但结合场景这是最典型的问题)。

修复方案

我们可以调整代码,改用内存友好的小缓冲区,再加上几个处理大文件的最佳实践:

import zipfile
from pathlib import Path
import shutil

def extract_to(zippath, dest, buffer_size=1024*1024):  # 1MB 缓冲区,可按需调整
    dest = Path(dest)
    dest.mkdir(exist_ok=True)  # 确保目标目录存在,避免路径错误
    
    with zipfile.ZipFile(zippath, mode='r') as z:
        for member in z.namelist():
            filename = Path(member).basename()
            if not filename:
                continue  # 跳过目录,只处理文件
            
            with z.open(member) as source, dest.joinpath(filename).open("wb") as target:
                shutil.copyfileobj(source, target, length=buffer_size)

关键改动说明

  • 缩小缓冲区大小:给copyfileobj()加上length参数,指定每次读写的数据块大小。1MB是比较安全的默认值,如果还是有内存压力,可以改成更小的数值(比如64*1024即64KB)。
  • 确保目标目录存在:新增dest.mkdir(exist_ok=True),避免因目标文件夹未创建而抛出“找不到路径”的错误。
  • 更规范的文件处理:用Path.open()替代直接调用open(),和pathlib的用法更契合,也更安全。

额外优化建议

如果上述方法还是不够(或者你想要更快的解压速度),可以直接调用系统原生的解压工具——系统级工具通常对大文件处理做了更多优化,内存开销也比Python的zipfile更小:

import subprocess
from pathlib import Path

def extract_to(zippath, dest):
    dest = Path(dest)
    dest.mkdir(exist_ok=True)
    # Linux/macOS 系统使用以下命令
    subprocess.run(["unzip", zippath, "-d", dest], check=True)
    # Windows 系统替换为这条命令:
    # subprocess.run(["powershell", "-Command", f"Expand-Archive -Path '{zippath}' -DestinationPath '{dest}'"], check=True)

只要你的系统安装了对应工具(Linux/macOS一般自带unzip,Windows通过PowerShell内置Expand-Archive),这个方法会更高效。

内容的提问来源于stack exchange,提问作者Giovanni Barbarani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:07:39