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

使用pickle保存Python字典时,如何避免设备空间不足导致的数据丢失?

解决Pickle保存时磁盘空间不足导致原数据丢失的问题

直接用'wb'模式打开文件会先清空原有内容,一旦磁盘空间耗尽,写入失败时原文件已经被破坏成0字节。要避免这个问题,核心思路是不要直接覆盖原文件,确保新内容写入成功后再替换旧文件,以下是具体方案:

方案一:临时文件+原子替换(最可靠)

先将数据写入临时文件,确认写入成功后,再用临时文件替换原文件。shutil.move在多数操作系统中是原子操作,不会出现文件损坏的中间状态。

import pickle
import os
import shutil

FILENAME = "your_data.pkl"
DATA = {"example_key": "example_value"}

temp_file = f"{FILENAME}.tmp"
try:
    # 先写入临时文件
    with open(temp_file, 'wb') as f:
        pickle.dump(DATA, f, protocol=pickle.HIGHEST_PROTOCOL)
    # 写入成功后替换原文件
    shutil.move(temp_file, FILENAME)
except OSError as e:
    # 写入失败时清理临时文件
    if os.path.exists(temp_file):
        os.remove(temp_file)
    # 抛出原异常让上层处理
    raise e

方案二:写入前预检查磁盘空间(辅助手段)

可以先估算序列化后的数据大小,再检查磁盘剩余空间,提前规避写入失败的情况。但注意:这种方法不能100%避免问题(检查后到写入前可能有其他进程占用磁盘空间),建议和方案一结合使用。

import pickle
import os
import shutil
import io

FILENAME = "your_data.pkl"
DATA = {"example_key": "example_value"}

# 先在内存中序列化,估算需要的磁盘空间
buffer = io.BytesIO()
pickle.dump(DATA, buffer, protocol=pickle.HIGHEST_PROTOCOL)
required_size = buffer.tell()

# 获取目标路径的磁盘剩余空间
disk_info = shutil.disk_usage(os.path.dirname(FILENAME))
# 预留双倍空间,避免估算误差或其他临时文件占用
if disk_info.free < required_size * 2:
    raise OSError("磁盘剩余空间不足,无法保存数据")

# 结合方案一的临时文件逻辑写入
temp_file = f"{FILENAME}.tmp"
try:
    with open(temp_file, 'wb') as f:
        pickle.dump(DATA, f, protocol=pickle.HIGHEST_PROTOCOL)
    shutil.move(temp_file, FILENAME)
except OSError as e:
    if os.path.exists(temp_file):
        os.remove(temp_file)
    raise e

核心逻辑总结

  • 永远不要直接覆盖正在使用的重要文件,用临时文件作为过渡是通用的安全策略。
  • 原子替换操作能保证文件要么是旧版本,要么是完整的新版本,不会出现损坏的中间状态。

内容的提问来源于stack exchange,提问作者Jasper Dent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:25:35