如何在Python程序的生命周期内对程序数据结构进行快照?

问题描述 投票:0回答:2

我想跟踪 python 程序生命周期中某些数据结构(字典)发生的变化。我们可以通过拍摄快照备份来实现这一点。备份不是“内存友好的”,因为它们需要将整个结构存储在内存中。因此,最巧妙的方法是拍摄快照(类似于 Git 暂存文件的方式)。

  1. Python 中有提供此功能的模块吗?
  2. 如果没有,是否有任何已知的算法可以在不复制数据的情况下描述数据结构的变化?

我不想使用数据库。

python python-3.x persistence snapshot backups
2个回答
0
投票

您可以使用pickle来保存Python数据结构。如果您随后使用日期(时间)模块来创建文件名,您将得到类似快照的内容:

import pickle
import datetime

def backup(your_data):
    with open(f"backup {datetime.datetime.now()}", "wb") as file:
        pickle.dump(your_data, file)

要获取数据,请使用 pickle.load 方法


0
投票

晚了四年,但我经常遇到这个问题。

我也不为此使用数据库,但技巧是您需要像将其放入数据库中一样对待要快照的数据。我的意思是,将数据压缩成最紧凑的形式,其中仍然有足够的信息来恢复原始数据结构。基本上,它与我之前的 pickling 答案类似,但具有人类可读的潜力。

对于相关数据结构,您需要两个函数:

to_json
将数据转换为 JSON 对象,以及
from_json
恢复对象。

obj == from_json(to_json(obj))

压缩数据的逻辑是只包含其他现有信息无法不断表达的信息。

例如,根据毕达哥拉斯定理,给定一个整数字典

{'a': 3, 'b': 4, 'c': 5}
a**2 + b**2 = c**2
。由于
c
可以用
a
b
来表示,因此可以压缩字典以删除
c

data = {'a': 3, 'b': 4, 'c': 5}
>>> compressed = to_json(data)
>>> compressed == {'a': 3, 'b': 4}
True
>>> restored = from_json(compressed)
>>> restored == data
True
>>> restored['c'] == (compressed['a']**2 + compressed['b']**2)**0.5
True

最重要的是对要压缩和恢复的数据有一套铁定的规则,这些规则永远不应该被破坏,因为与原始对象相比,这样做可能会导致恢复后的数据丢失。

我希望这个解释虽然很抽象,但可以帮助任何将来遇到这种困境的人。

© www.soinside.com 2019 - 2024. All rights reserved.