繁体   English   中英

Python 序列化 - 为什么选择pickle?

[英]Python serialization - Why pickle?

我知道 Python 酸洗是一种以尊重对象编程的方式“存储”Python 对象的方法 - 不同于用 txt 文件或 DB 编写的输出。

您是否有关于以下几点的更多详细信息或参考资料:

  • 腌制物品“存放”在哪里?
  • 为什么酸洗保留对象表示比存储在数据库中更多?
  • 我可以从一个 Python shell 会话到另一个会话检索腌制对象吗?
  • 当序列化有用时,你有重要的例子吗?
  • 使用pickle 进行序列化是否意味着数据“压缩”?

换句话说,我正在寻找关于酸洗的文档 - Python.doc 解释了如何实现酸洗,但似乎没有深入了解有关序列化的使用和必要性的细节。

Pickling 是一种将 Python 对象(列表、字典等)转换为字符流的方法。 这个想法是这个字符流包含在另一个 python 脚本中重建对象所需的所有信息。

至于腌制信息的存储位置,通常会这样做:

with open('filename', 'wb') as f:
    var = {1 : 'a' , 2 : 'b'}
    pickle.dump(var, f)

这会将我们的var dict 的腌制版本存储在 'filename' 文件中。 然后,在另一个脚本中,您可以从此文件加载到变量中,然后重新创建字典:

with open('filename','rb') as f:
    var = pickle.load(f)

酸洗的另一个用途是,如果您需要通过网络(可能使用套接字或其他方式)传输此字典。首先需要将其转换为字符流,然后才能通过套接字连接发送它。

此外,这里没有“压缩”可言……这只是将一种表示(在 RAM 中)转换为另一种(在“文本”中)的方法。

About.com 在这里有一个很好的酸洗介绍。

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

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

为此,我使用dill ,它可以序列化 Python 中的几乎所有内容。 Dill 也有一些很好的工具,可以帮助您了解在代码失败时是什么导致酸洗失败。

而且,是的,人们使用选择来保存计算的状态,或者你的ipython会话,或者其他任何东西。 如果您愿意,您还可以扩展 pickle 的 Pickler 和 UnPickler 以使用bz2gzip进行压缩。

我发现它对于大型和复杂的自定义类特别有用。 在我想到的一个特定示例中,“收集”信息(来自数据库)以创建类已经成功了一半。 然后,用户可能会在运行时更改存储在类中的信息。

您可以在数据库中拥有另一组表并编写另一个函数来检查存储的所有内容并将其写入新的数据库表。 然后你需要编写另一个函数来加载通过读回所有这些信息而保存的内容。

或者,您可以按原样腌制整个类,然后将其存储到数据库中的单个字段中。 然后当你去加载它时,它会像以前一样一次性加载回来。 在保存和检索复杂的类时,这最终会节省大量时间和代码。

这是一种序列化。 使用 cPickle 它比泡菜快得多。

import pickle
##make Pickle File
with open('pickles/corups.pickle', 'wb') as handle:
    pickle.dump(corpus, handle)

#read pickle file
with open('pickles/corups.pickle', 'rb') as handle:
    corpus = pickle.load(handle)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM