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

