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
相关产品推荐
相关产品推荐

