这里使用持久ID来解决什么pickle问题?

2024-04-04

From https://docs.python.org/3/library/pickle.html#persistence-of-external-objects https://docs.python.org/3/library/pickle.html#persistence-of-external-objects

为了对象持久化的好处,pickle 模块支持对 pickled 数据流外部对象的引用的概念。 此类对象由持久 ID 引用,该 ID 应该是 一串字母数字字符(对于协议 0)或只是一个 任意对象(对于任何较新的协议)。

如果有人能解释一下:这里使用持久 ID 来解决的酸洗问题是什么?也就是说,如果不使用持久化ID,pickling会有什么问题呢?

特别是,“对腌制数据流之外的对象的引用的概念”是什么意思?它是否与其他一些概念相反,例如“对腌制数据流内的对象的引用的概念”?


“pickle 数据流”是“什么”的通用描述pickle.dump and pickle.load do”. A 数据流例如,可以读取数据的文件依次地。它是一个泡菜数据当所述流包含时的流pickle 生成或消耗的数据.

Pickle Streams 有一个概念内部参考文献- 如果同一个对象在流中出现多次,则它仅存储一次,然后仅被引用。但是,这仅指已存储在流中的内容 - 引用不能指向流外部的对象,例如原始对象。从概念上讲,pickle 数据流的内容是其原始数据的副本。

import pickle

bar = (1, 2)
foo = {1: 1, 2: (1, 1), 'bar': bar}

with open('foo.pkl', 'wb') as out_stream:  # open a data stream...
     pickle.dump((bar, foo), out_stream)   # ...for pickle data

with open('foo.pkl', 'rb') as in_stream:
     bar2, foo2 = pickle.load(in_stream)

assert bar2 is foo2['bar']  # internal identity is preserved
assert bar is not bar2      # external identity is broken

持久 ID 可用于引用不在流中的内容 - 例如原始对象、全局数据库句柄、另一个流中的内容或类似内容。从概念上讲,持久 ID 只是允许其他代码处理 pickling/unpickling。然而,持久 ID 的定义和实现取决于要解决的问题。

定义和使用持久 ID 并不困难。然而,它需要一些编排和簿记。一个非常简单的例子如下所示:

import pickle

# some object to persist
# usually, one would have some store or bookkeeping in place
bar = (1, 2)


# The create/load implementation of the persistent id
# extends pickling/unpickling
class PersistentPickler(pickle.Pickler):
    def persistent_id(self, obj):
        """Return a persistent id for the `bar` object only"""
        return "it's a bar" if obj is bar else None


class PersistentUnpickler(pickle.Unpickler):
    def persistent_load(self, pers_id):
        """Return the object identified by the persistent id"""
        if pers_id == "it's a bar":
           return bar
        raise pickle.UnpicklingError("This is just an example for one persistent object!")


# we can now dump and load the persistent object
foo = {'bar': bar}
with open("foo.pkl", "wb") as out_stream:
    PersistentPickler(out_stream).dump(foo)

with open("foo.pkl", "rb") as in_stream:
    foo2 = PersistentUnpickler(in_stream).load()

assert foo2 is not foo     # regular objects are not persistent
assert foo2['bar'] is bar  # persistent object identity is preserved

作为一个现实世界的例子,我的旧cpy2py模块 https://github.com/maxfischer2781/cpy2py使用pickle在不同解释器之间交换数据。对于常规的类似值的对象,这意味着在一个解释器中进行序列化并在另一种解释器中进行反序列化。对于某些特殊的有状态对象,这意味着仅交换在所有连接的解释器中唯一标识该对象的持久 ID。

涉及到一些簿记,但你可以想到永久ID https://github.com/maxfischer2781/cpy2py/blob/master/cpy2py/proxy/tracker.py在这种情况下作为元组(process_id, object_id, object_type)。拥有的解释器可以使用此 ID 来查找真实对象,而其他解释器可以创建一个占位符对象。这种情况下的重点是状态不是被存储和复制的,而只是被引用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这里使用持久ID来解决什么pickle问题? 的相关文章

  • 使用应用程序脚本将 MS Word 文件(保存在云端硬盘中)转换为 Google 文档

    我被某些事情困住了 找不到解决办法 有没有办法使用文件 url 或 id 将存储在 Google Drive 中的 MS Word 文件转换为 Google 文档 我目前有一个电子表格 其中包含文件的网址 或者 也可以使用 python 脚
  • Python GTK + webkit - 在 gtk.main() 之后插入 JavaScript

    我在终端中尝试了这个 一切正常 但是如果我在脚本内运行这个 我无法在 gtk main 之后插入 JavaScript import gtk import webkit w gtk Window b webkit WebView w add
  • 以矢量化方式在另一个 DataFrame 中查找包含值子集的行

    如何匹配此 DataFrame 中的值source car id lat lon 0 100 10 0 15 0 1 100 12 0 10 0 2 100 09 0 08 0 3 110 23 0 12 0 4 110 18 0 32 0
  • 组和平均 NumPy 矩阵

    假设我有一个任意的 numpy 矩阵 如下所示 arr 6 0 12 0 1 0 7 0 9 0 1 0 8 0 7 0 1 0 4 0 3 0 2 0 6 0 1 0 2 0 2 0 5 0 2 0 9 0 4 0 3 0 2 0 1 0
  • Tipfy:如何在模板中显示blob?

    鉴于在 gae 上使用tipfy http www tipfy org python 以下模型 greeting avatar db Blob avatar 显示 blob 此处为图像 的模板标签是什么 在这种情况下 斑点是一个图像 这很棒
  • 将一维数组转换为下三角矩阵

    我想将一维数组转换为较低的零对角矩阵 同时保留所有数字 我知道numpy tril函数 但它用零替换了一些元素 我需要扩展矩阵以包含所有原始数字 例如 10 20 40 46 33 14 12 46 52 30 59 18 11 22 30
  • scikit-learn 和tensorflow 有什么区别?可以一起使用它们吗?

    对于这个问题我无法得到满意的答案 据我了解 TensorFlow是一个数值计算库 经常用于深度学习应用 而Scikit learn是一个通用机器学习框架 但它们之间的确切区别是什么 TensorFlow 的目的和功能是什么 我可以一起使用它
  • 如何使用 PyMongo 在重复键错误后继续插入

    如果我需要在 MongoDB 中插入尚不存在的文档 db stock update one document set document upsert True 将完成这项工作 如果我错了 请随时纠正我 但是 如果我有一个文档列表并想将它们全
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • Pandas groupby apply 执行缓慢

    我正在开发一个涉及大量数据的程序 我正在使用 python pandas 模块来查找数据中的错误 这通常工作得非常快 然而 我当前编写的这段代码似乎比应有的速度慢得多 我正在寻找一种方法来加快速度 为了让你们正确测试它 我上传了一段相当大的
  • Jupyter Notebook 中的深色模式绘图 - Python

    我正在使用 Jupyter Notebook 目前正在使用 JupyterThemes 的深色日光主题 我注意到我的绘图不是处于黑暗模式 并且文本仍然是黑色并且在日光照射的背景上无法读取 JupyterThemes 的自述文件建议在 ipy
  • 根据列索引重命名 Dataframe 列

    是否有内置函数可以按索引重命名 pandas 数据框 我以为我知道列标题的名称 但事实证明第二列中有一些十六进制字符 根据我接收数据的方式 我将来可能会在第 2 列中遇到这个问题 因此我无法将这些特定的十六进制字符硬编码到 datafram
  • Django Rest Framework POST 更新(如果存在或创建)

    我是 DRF 的新手 我阅读了 API 文档 也许这是显而易见的 但我找不到一个方便的方法来做到这一点 我有一个Answer与 a 具有一对一关系的对象Question 在前端 我曾经使用 POST 方法来创建发送到的答案api answe
  • 删除 HoloViews 中的 Bokeh 徽标

    是否可以从 HoloViews 生成的图中删除 Bokeh 徽标 没有什么反对的 只是在某些报告中显示它可能没有意义 我知道在 Bokeh 中我可以简单地执行以下操作 p bkp figure p toolbar logo None UPD
  • 在 matplotlib 中绘制多边形的并集[重复]

    这个问题在这里已经有答案了 我正在尝试绘制几个多边形的并集matplotlib 具有一定的 alpha 水平 我当前的代码在交叉点处颜色较深 有没有办法让交叉路口与其他地方的颜色相同 import matplotlib pyplot as
  • python dicttoxml 多次使用相同的键

    我正在尝试做如下所示的 xml
  • 如何从 nltk 下载器中删除数据/模型?

    我在 python3 NLTK 中安装了一些 NLTK 包 通过nltk download 尝试过它们 但不需要它们 现在想删除它们 我怎样才能删除例如包large grammars来自我的 NLTK 安装 我不想删除完整的 NLTK 安装
  • 如何使用 Python 3 正确显示倒计时日期

    我正在尝试获取将显示的倒计时 基本上就像一个世界末日时钟哈哈 有人可以帮忙吗 import os import sys import time import datetime def timer endTime datetime datet
  • 使用 SERVER_NAME 时出现 Flask 404

    在我的 Flask 配置中 我将 SERVER NAME 设置为 app example com 之类的域 我这样做是因为我需要使用url for with external网址 如果未设置 SERVER NAME Flask 会认为服务器
  • Python 中的字符串slugification

    我正在寻找 slugify 字符串的最佳方法 蛞蝓 是什么 https stackoverflow com questions 427102 in django what is a slug 我当前的解决方案基于这个食谱 http code

随机推荐