OSError: [Errno 24] Too many open files:两个 DataLoader 可以 zip,先查文件描述符

简介: 原帖双Loader并发读取ZIP导致“Too many open files”(Errno 24),实为文件描述符泄漏或生命周期管理不当,非ZIP不支持DataLoader。需排查Dataset中图像/HDF5/ZIP句柄是否及时释放,并优先采用单Loader配对Dataset保障数据一致性与资源可控性。(239字)

原帖双图网络同时遍历两个 loader,在读取阶段耗尽文件描述符;这不意味着 zip 不支持 DataLoader:

OSError: [Errno 24] Too many open files

zip 可以遍历,问题是并发资源或句柄生命周期

原题同时读取两路图片,Errno 24 指向文件描述符上限。没有 Dataset 打开文件的实现,无法确认泄漏位置;先观察 fd 数随批次是否增长,再区分不释放文件与合理并发需求。提高上限可能推迟故障,不一定修复资源生命周期。

先在 Linux/Unix 的训练进程记录限制与当前描述符数量;原帖并非 Windows 路径:

import os
import resource
print("josh050608")
print("open-file limits:", resource.getrlimit(resource.RLIMIT_NOFILE))
fd_dir = "/proc/self/fd"
print("open fds:", len(os.listdir(fd_dir)) if os.path.isdir(fd_dir) else "proc unavailable")

resource 不适用于 Windows;那里需要相应平台工具。先把两个 loader 的 num_workers 都设为 0,短程观察文件数量是否持续上升。如果单进程也增长,检查 Dataset 中 Image.open、文件读取、压缩包和 HDF5 句柄是否被释放;例如图像读取应使用上下文管理器完成加载/复制后再返回。

如果只在多进程出现,逐步增加 worker 数,核对并发打开的文件、共享 Tensor 的 IPC 资源以及是否反复创建未释放的迭代器。不要只提高 ulimit 来掩盖泄漏;确实有合理并发需求时,再在系统允许范围内调整软限制。

双 loader 可以写 for batch1,batch2 in zip(loader1,loader2):,但它会在较短一侧结束,独立 shuffle 也不保证图像配对。Siamese 任务更适合一个样本返回 (image1,image2,label) 的配对 Dataset,再由一个 loader 组批。

验证完整一轮文件数量稳定、读取正常且图片配对正确。原帖没有 Dataset 打开文件的实现,不能断言已定位哪一种泄漏。

先保证图像配对,再观察资源变化

Siamese 输入通常由同一条样本定义两张图片及关系标签。下面用合成张量展示一个配对 Dataset,避免两个 loader 独立 shuffle 后失配:

import torch
from torch.utils.data import Dataset, DataLoader
class PairDataset(Dataset):
    def __len__(self):
        return 5
    def __getitem__(self, index):
        left = torch.full((1, 4, 4), float(index))
        right = torch.full((1, 4, 4), float(index + 10))
        return left, right, index % 2
loader = DataLoader(PairDataset(), batch_size=2, shuffle=True, num_workers=0)
count = 0
for left, right, labels in loader:
    assert left.shape == right.shape
    assert torch.equal(right-left, torch.full_like(left, 10))
    assert len(labels) == len(left)
    count += len(left)
assert count == 5
print("paired samples:", count)

真实 Dataset 的文件读取使用上下文管理器,返回前完成必要的加载或复制;HDF5、压缩包等有自己的进程与句柄规则,应按对应库约定管理。不要把未关闭的文件对象长期存进样本列表。

在一轮开始、每隔固定批次和结束记录 fd 数。单进程也持续增长,优先查读取代码;只在多 worker 上升,检查 worker 数、IPC 共享资源与反复创建迭代器。正常缓存建立后稳定,与每轮无界增长是不同现象。

若保留双 loader,确认 zip 会在较短一侧结束,且两路采样方案保持配对。最终验证样本覆盖、配对与 fd 稳定,而非只提高 ulimit 后暂时不抛异常。原帖缺少读取实现,具体泄漏原因仍需本地证据。

参考:原始求助帖;技术依据:PyTorch 数据加载(2.5)、Python 资源限制、PyTorch 多进程建议(2.5)、Pillow 图像打开与转换。

相关文章
|
10天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
3995 19
|
11天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
4135 49
|
11天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1976 7
|
6天前
|
云安全 人工智能 安全
|
6天前
|
存储 弹性计算 人工智能
2026 年阿里云双十一活动入口攻略,新客服务器优惠通道、三大会场入口梳理
综合来看,2026年阿里云双十一活动入口清晰: 阿里云轻量应用服务器、阿里云ECS云服务器、阿里云GPU云服务器、阿里云百炼大模型服务平台 活动会场、综合权益中心、99计划专场三大入口覆盖服务器、AI权益与续费特价;新用户通过控制台首页banner、权益中心、产品页三处路径进入专属专场,老用户通过控制台弹窗和费用中心权益中心进入老客专区,企业用户做企业实名后解锁专属满减与阶梯折扣。
819 0
|
5天前
|
Linux 开发工具 iOS开发
2026最新codex下载安装保姆级使用教程(下载+安装+登录+使用,含所有历史版本)
本文详解OpenAI Codex国内快速上手指南:提供Win/macOS/Linux全平台免安装包、npm/Homebrew等多方式安装、账号/API Key双登录、简体中文切换,覆盖下载、安装、汉化、使用及高频避坑(如微软商店失败、npm超时等),10分钟即可跑通。
1087 2
|
12天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
2144 6
|
云安全 安全 网络安全
|
24天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
4337 58