我已经看过了泡菜的文档,但我不明白的地方泡菜是非常有用的。
什么是一些常见的用例的泡菜?
我已经看过了泡菜的文档,但我不明白的地方泡菜是非常有用的。
什么是一些常见的用例的泡菜?
我所遇到的一些用途:
1)保存程序的状态数据到磁盘,以便它可以在重新启动时,它离开的地方进行(持久性)
2)在以上的多芯TCP连接或分布式系统(编组)发送数据蟒
3)在数据库中存储Python对象
4)任意蟒对象转换为字符串,以便它可以被用来作为字典密钥(例如用于高速缓存&记忆化)。
有一些问题与最后一个 - 两个相同的对象可以腌制,并导致不同串中 - 甚至腌制两次相同的对象可以有不同的表示。 这是因为泡菜可以包括引用计数信息。
为了强调@ lunaryorn的评论 - 你永远不应该从不受信任的源unpickle一个字符串,因为一个精心制作的泡菜可以在系统上执行任意代码。 例如看到https://blog.nelhage.com/2011/03/exploiting-pickle/
最小往返例子..
>>> 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
我本人看到正在通过网络发送的腌渍对象的几个例子作为一个易于使用的网络传输协议。
我在我的一个项目中使用它。 如果在它的工作的应用程序被终止(它没有冗长的任务和处理大量的数据),我需要保存整个数据结构,并重新加载它的应用程序被再次运行后。 我用cPickle的这一点,因为速度是至关重要的事情,数据的大小是非常大的。
酸洗是用于分布式和并行计算绝对必要的。
假设你想要做一个平行的地图,减少与multiprocessing
(或跨与群集节点pyina ),那么你需要确保你想要的功能已经跨越并联资源映射将咸菜。 如果没有咸菜,则无法将其发送到其他资源上的另一个进程,计算机等也看到这里的一个很好的例子。
要做到这一点,我用莳萝 ,可序列化的Python几乎所有的东西。 莳萝也有一些很好的工具,帮助您了解是什么原因导致你的酸洗当你的代码没有失败。
而且,是的,人们用采摘保存计算,或者你的状态IPython的会话,或什么的。
对于初学者(这是我的情况),这真的很难理解为什么使用泡菜摆在首位读取时的正式文件 。 这或许是因为文档意味着你已经知道序列化的全部目的。 只有阅读后一般描述系列化都我明白这个模块及其常见的用例的原因。 此外系列化的广泛解释忽略一个特定的编程语言可以帮助: https://stackoverflow.com/a/14482962/4383472 , 什么是序列化? , https://stackoverflow.com/a/3984483/4383472
要添加一个真实的例子:该狮身人面像为Python文档工具使用咸菜缓存解析文件和文件之间的交叉引用,加快后续构建的文档。
泡菜是像“另存为...”和“打开...”为您的数据结构和类。 比方说,我要救我的数据结构,所以它是程序运行之间持续。
保存:
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,我可以随便挑(LE)从最多我离开的地方。
我可以告诉你,我用它,并看到它使用的用途:
这些都是我用它为那些至少
我的网络当时我想存储超过8000K的URL杀网站的一个过程中使用酸洗,并希望以最快的速度处理它们尽可能所以我用酸洗,因为它的输出质量是非常高的。
您可以轻松地到达网址,并在那里你甚至停止作业目录键字也非常快提取网址细节恢复过程。