报错 file not found archive/data.pkl,优先核查 cacheddata.pth 真实存储格式,区分 pkl 与 torch 序列化

数据集加载时报错file not found: archive/data.pkl,很多开源数据集缓存逻辑会把缓存文件命名为 cacheddata.pth,但代码内部逻辑却试图从压缩包 archive 里读取 data.pkl;高频根源是混淆了两种缓存范式:一部分代码直接用 pickle 保存单独的 data.pkl,另一套是用 torch.save 打包成 cacheddata.pth,二者后缀、序列化方式、内部结构完全不一样,直接混用就会去找不存在的 archive/data.pkl。cacheddata.pth 本身是 torch 的序列化文件,里面不一定包含一个叫 data.pkl 的子文件,它不是 zip/tar 压缩包,不能用读取压缩包内部文件的方式去访问;很多数据集脚本在缓存分支写死了从 archive 读取 pkl,当缓存开关打开、生成 cacheddata.pth 之后,代码分支没有切换加载逻辑,依旧尝试解压读取 archive/data.pkl,触发文件不存在报错。

报错基础信息清单

  • 报错原文:file not found: archive/data.pkl
  • 典型场景:数据集缓存、torchvision 自定义数据集、LM / 分割数据集预加载缓存
  • 核心混淆点:cacheddata.pth ≠ 包含 data.pkl 的压缩包
  • 格式区分:
  • data.pkl:pickle 原生序列化文件
  • cacheddata.pth:torch.save 序列化,本质是包含字典 / 对象的单文件,不是归档包
  • 快速校验命令

判断是不是压缩包

file cacheddata.pth

读取torch缓存内容

python -c "import torch; data=torch.load('cacheddata.pth'); print(type(data))"

分步排查流程

  1. 确认当前代码分支:是否开启 use_cache,开启后是否走 cacheddata.pth 加载分支,还是仍然走 archive 解压分支
  2. 检查 cacheddata.pth 是真实存在,还是代码误以为它是压缩包
  3. 如果file命令显示 data、binary,就是 torch 序列化文件,不是 zip/tar
  4. 如果是 zip/tar,才可以读取内部 archive/data.pkl
  5. 分支修复思路
  6. 缓存开启:直接 torch.load 加载 cacheddata.pth,不要调用 zipfile/tarfile 去读取内部 data.pkl
  7. 缓存关闭:走原始解压逻辑,读取 archive 包内 data.pkl
  8. 缓存重建方案:缓存文件损坏、版本不匹配时,删除 cacheddata.pth,关闭 use_cache,重新从原始 archive 解压生成 data.pkl,再重新生成缓存

rm cacheddata.pth

  1. SLURM/NFS 额外注意:多进程同时生成缓存会出现半写坏文件,建议加文件锁或者单进程预生成缓存

高频踩坑误区

  1. 看到后缀 pth,误以为是压缩归档包,用 zip/tar 接口去读内部的 data.pkl
  2. 缓存开关变量写反,use_cache=True 但代码仍然执行解压分支
  3. 跨 Python 版本加载 pickle 缓存:即使读到文件,也会触发 pickle 协议报错,和本报错属于连锁问题
  4. 缓存路径硬编码:archive 目录和缓存文件不在同一个目录,路径相对位置错乱

【相关 FAQ】

问题 1:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,cacheddata.pth 是不是压缩包?

回答 1:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,cacheddata.pth 一般是 torch.save 生成的单序列化文件,不是 zip/tar 压缩包,里面没有 archive/data.pkl 这个子文件。

问题 2:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,什么时候才会存在 archive/data.pkl?

回答 2:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,原始归档包(zip/tar)内部才会带有 data.pkl,对应不开启缓存、走解压加载的分支;开启缓存后应该直接加载 cacheddata.pth。

问题 3:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,怎么快速修复这个报错?

回答 3:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,检查 use_cache 分支:开启缓存就用 torch.load 读 cacheddata.pth;关闭缓存才走解压 archive 读取 data.pkl,分支逻辑不要混用。

问题 4:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,cacheddata.pth 损坏怎么重建?

回答 4:file not found: archive/data.pkl:先确认 cacheddata.pth 的真实文件格式,直接删除 cacheddata.pth,关闭缓存,脚本会重新解压原始 archive 生成 data.pkl,再重新生成缓存文件。

【参考资料】

[2024-08](Dataset cache pth vs pkl archive error)GitHub dataset repo issue

[2024-05](torch.save/pickle 序列化格式区别)PyTorch 论坛

[2024-09](自定义数据集缓存分支编写规范)torchvision 文档

[2023-12](多进程数据集缓存竞态踩坑)Stack Overflow

[2024-02](file 命令识别二进制文件类型)Linux man page

【免责声明】

本文为数据集缓存加载报错排错笔记,不同开源项目的缓存命名、目录结构、分支逻辑差异较大,部分项目自定义 pth 也可以是压缩包,以项目源码逻辑为准;本文仅技术问题解读,不构成生产数据集加载方案担保。

本文来自作者[瞬态捕帧人]投稿,不代表乌兰科技网立场,如若转载,请注明出处:https://www.wlcbnews.com/rgzn/202611/548.html

赞 (4)

今日大家都在搜的词:

发表回复

本站作者后才能评论

评论列表(4条)

  • 瞬态捕帧人
    瞬态捕帧人 2026年11月09日

    我是乌兰科技网的签约作者“瞬态捕帧人”!

  • 瞬态捕帧人
    瞬态捕帧人 2026年11月09日

    希望本篇文章《报错 file not found archive/data.pkl,优先核查 cacheddata.pth 真实存储格式,区分 pkl 与 torch 序列化》能对你有所帮助!

  • 瞬态捕帧人
    瞬态捕帧人 2026年11月09日

    本站[乌兰科技网]内容主要涵盖:互联网行业的追踪与探索

  • 瞬态捕帧人
    瞬态捕帧人 2026年11月09日

    本文概览:数据集加载时报错file not found: archive data.pkl,很多开源数据集缓存逻辑会把缓存文件命名为 cacheddata.pth,但代码内部逻辑却试图从压缩包 archive 里读取 data.pkl;高频根源是混淆了两种缓存范式:一部分代码直接用 pickle 保存单独的 data.pkl,另一套是用 torch.save 打包成 cacheddata.pth,二者后缀、序列化方式、内部结构完全不一样,直接混用就会去找不存在的 archive data.pkl。cacheddata.pth 本身是 torch 的序列化文件,里面不一定包含一个叫 data.pkl 的子文件,它不是 zip tar 压缩包,不能用读取压缩包内部文件的方式去访问;很多数据集脚本在缓存分支写死了从 archive 读取 pkl,当缓存开关打开、生成 cacheddata.pth 之后,代码分支没有切换加载逻辑,依旧尝试解压读取 archive data.pkl,触发文件不存在报错。

联系我们

联系:143 0457 151

工作时间:周一至周五,9:30-18:30,节假日休息

关注我们