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

使用dill加载50万直方图大文件触发EOFError,求非拆分解决方案

解决dill加载大直方图列表时的EOFError问题

碰到过类似的大对象序列化踩坑经历,除了拆分数据集,你可以试试下面这些方案:

1. 改用二进制模式读写文件

你当前用的是文本模式("w"/"r")来读写dill序列化的内容,这是非常容易踩的坑!文本模式会自动处理换行符转换,导致序列化的二进制数据被破坏,加载时就会触发EOFError。

修正后的代码:

# 保存
file = open("file.txt", "wb")  # 用wb二进制写入模式
dill.dump(test_list, file)
file.close()

# 加载
file = open("file.txt", "rb")  # 用rb二进制读取模式
test_list = dill.load(file)
file.close()

这应该是最可能解决你问题的第一步!

2. 分块序列化/反序列化

不用拆分原始数据集,而是把列表分成小块分别序列化,加载时再拼接起来。这样既避免一次性处理超大对象,也能降低单个文件损坏的影响:

# 分块保存
chunk_size = 10000  # 每1万条存一块
with open("histograms.dill", "wb") as f:
    for i in range(0, len(test_list), chunk_size):
        chunk = test_list[i:i+chunk_size]
        dill.dump(chunk, f)

# 分块加载
test_list = []
with open("histograms.dill", "rb") as f:
    while True:
        try:
            chunk = dill.load(f)
            test_list.extend(chunk)
        except EOFError:
            break

3. 升级dill或更换序列化库

你用的是Python2.7,对应的dill版本可能比较老旧,对大对象的支持不够好。可以尝试升级到Python2.7兼容的最新dill版本:

pip install --upgrade dill==0.3.1.1  # 这个版本支持Python2.7

另外,也可以试试专门针对大数值数据优化的joblib库(如果你的直方图是numpy数组之类的结构,效果会更好):

import joblib

# 保存
joblib.dump(test_list, "histograms.joblib")

# 加载
test_list = joblib.load("histograms.joblib")

4. 检查文件完整性与磁盘状态

有时候EOFError是因为保存时磁盘空间不足,导致文件被截断,或者文件在传输/存储过程中损坏。你可以:

  • 检查保存后的文件大小是否符合预期(比如50万条直方图的文件应该比10万条的大5倍左右)
  • 尝试重新保存一次,确认没有磁盘写入错误

5. 使用pickle更高协议

dill默认会沿用pickle的协议,Python2.7支持最高协议2,显式指定更高协议可能提升大对象序列化的稳定性:

dill.dump(test_list, file, protocol=2)

内容的提问来源于stack exchange,提问作者st2 tas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:28