140

我查看了泡菜文档,但我不明白泡菜在哪里有用。

泡菜的一些常见用例是什么?

4

9 回答 9

66

我遇到的一些用途:

1) 将程序的状态数据保存到磁盘,以便它可以在重新启动时从中断的地方继续(持久性)

2) 在多核或分布式系统中通过 TCP 连接发送 python 数据(编组)

3)将python对象存储在数据库中

4) 将任意 python 对象转换为字符串,以便它可以用作字典键(例如,用于缓存和记忆)。

最后一个存在一些问题——两个相同的对象可以被腌制并导致不同的字符串——甚至相同的对象被腌制两次也可能有不同的表示。这是因为泡菜可以包含引用计数信息。

为了强调@lunaryorn 的评论——你永远不应该从不受信任的来源解开字符串,因为精心制作的泡菜可以在你的系统上执行任意代码。例如参见https://blog.nelhage.com/2011/03/exploiting-pickle/

于 2010-08-09T12:21:53.873 回答
11

最小的往返示例..

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

编辑:但至于酸洗的实际例子的问题,也许酸洗先进的使用(你必须深入挖掘源代码)是 ZODB: http ://svn.zope.org/

否则,PyPI 会提到几个: http ://pypi.python.org/pypi?:action=search&term=pickle&submit=search

我个人见过几个通过网络发送腌制对象的示例,作为一种易于使用的网络传输协议。

于 2010-08-09T09:20:17.717 回答
8

我在我的一个项目中使用过它。如果应用程序在运行期间被终止(它执行了一项冗长的任务并处理了大量数据),我需要保存整个数据结构并在应用程序再次运行后重新加载它。我为此使用了 cPickle,因为速度是至关重要的,而且数据量非常大。

于 2010-08-09T09:34:03.867 回答
8

酸洗对于分布式和并行计算是绝对必要的。

假设您想使用(或使用pyinamultiprocessing跨集群节点)进行并行 map-reduce,那么您需要确保要在并行资源之间映射的函数会腌制。如果它不腌制,则不能将其发送到另一个进程、计算机等上的其他资源。另请参见此处以获取一个很好的示例。

为此,我使用dill,它可以在 python 中序列化几乎任何东西。Dill 还提供了一些很好的工具,可以帮助您了解在代码失败时导致酸洗失败的原因。

而且,是的,人们使用pick来保存计算的状态,或者你的ipython会话,或者其他什么。

于 2013-10-14T12:31:16.027 回答
6

对于您的数据结构和类,Pickle 就像“另存为..”和“打开..”。假设我想保存我的数据结构,以便它在程序运行之间保持不变。

保存:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        

加载:

try:
    with open("save.p", "rb") as f:
        myStuff = pickle.load(f)
except:
    myStuff = defaultdict(dict)

现在我不必从头开始构建 myStuff,我可以从上次中断的地方继续。

于 2017-04-14T15:51:45.667 回答
4

对于初学者(就像我一样),在阅读官方文档时,真的很难理解为什么首先要使用 pickle 。这可能是因为文档暗示您已经知道序列化的全部目的。只有在阅读了序列化的一般描述之后,我才理解了这个模块的原因和它的常见用例。忽略特定编程语言的序列化的广泛解释可能会有所帮助: https ://stackoverflow.com/a/14482962/4383472 ,什么是序列化?, https://stackoverflow.com/a/3984483/4383472

于 2015-03-10T00:11:18.027 回答
3

添加一个真实的示例:Python 的Sphinx文档工具使用 pickle 来缓存已解析的文档和文档之间的交叉引用,以加快文档的后续构建。

于 2012-07-31T18:28:23.270 回答
1

我可以告诉你我使用它的用途,并且已经看到它用于:

  • 游戏资料保存
  • 游戏数据可以挽救生命和健康
  • 输入到程序的说数字的先前记录

这些是我至少使用它的那些

于 2016-05-30T17:01:31.553 回答
1

我在网页抓取期间使用酸洗,当时我想存储超过 8000k 的网址并希望尽快处理它们,所以我使用酸洗,因为它的输出质量非常高。

您可以轻松访问 url 和停止工作目录关键字的位置,也可以非常快速地获取 url 详细信息以恢复该过程。

于 2018-07-20T12:59:13.347 回答