使用pickle(Python)进行模块化序列化



我想以模块化的方式对一些对象图进行序列化。也就是说,我不想序列化整个图形。原因是这个图很大。我可以保留图表某些部分的时间戳版本,并且可以进行一些延迟访问以推迟加载我现在不需要的部分。

以为我可以用Python的元编程来管理它。但似乎元编程在Python中还不够强大。

这就是我现在所做的。我的图形由几个不同的对象组成。其中一些是特殊类的实例。此类描述要酸洗的根对象。这就是模块化的用武之地。每次我腌制东西时,它都是从其中一个实例开始的,我从来不会同时腌制其中两个。每当存在对另一个实例的引用(根对象可访问(时,我都会将此引用替换为persistant_id,从而确保我不会在同一个酸洗流中有两个实例。解开溪流时出现问题。我可以找到尚未加载的实例的persistant_id。在这种情况下,我必须等待加载目标实例,然后才能允许访问它。而且我无论如何都看不出可以这样做:

1/我试图构建一个访问器,该访问器获取方法返回引用的目标。不幸的是,访问器必须放在类声明中,我不能将它们分配给未拾取的对象。2/我可以将必须解决引用的地方存储在某个地方。我认为这在 Python 中是不可能的:不能保留对位置(字段或变量(的引用,只能保留对值的引用。

我的问题可能不清楚。我仍在寻找一个清晰的表述。我尝试了其他事情,例如使用显式引用,这将是某个"引用"类的实例。不过这不是很方便。

您知道如何使用泡菜实现模块化序列化吗?我是否必须更改Unpickler的内部行为才能记住需要加载对象图剩余部分的位置?有没有另一个库更适合实现类似的结果?

以下是我认为我会怎么做。

  1. 具有模块级字典映射到 SpecialClass 对象persistent_id。每次初始化或取消挑选SpecialClass实例时,请确保将其添加到字典中。

  2. 重写 SpecialClass 的 __getattr____setattr__ 方法,以便specialobj.foo = anotherspecialobj仅将persistent_id存储在 specialobj 上的字典中(我们称之为 specialobj.specialrefs (。当您检索 specialobj.foo 时,它会在 specialrefs 中找到名称,然后在模块级字典中查找引用。

  3. 有一个模块级别的check_graph函数,它将遍历已知的SpecialClass实例,并检查它们的所有 specialref 是否可用。

元编程在Python中很强;Python类具有极强的可塑性。您可以在声明后按照您想要的方式更改它们,尽管最好在元类(装饰器(中完成。更重要的是,实例具有延展性,独立于其类。

"对地点的引用"通常只是一个字符串。 例如,对对象字段的引用是其名称。假设节点对象中有多个节点引用。你可以有类似{persistent_id: (object, field_name),..}的东西作为未解析的引用表,很容易查找。同样,在节点列表中,"对地点的引用"是索引。

顺便说一句,您可以使用键值数据库进行图形存储吗?您将能够按 ID 拉取节点而无需等待。

最新更新