【问题标题】:Limitations of python pickle? Can it serialize anything?python泡菜的局限性?它可以序列化任何东西吗?
【发布时间】:2020-10-04 21:55:17
【问题描述】:

我正在编写一个小模块,它必须能够将任何内容持久化到磁盘。

我不提前知道变量中会包含什么样的数据,所以我需要可以将 ANYTHING 序列化到磁盘的默认功能。

我认为在这种情况下 pickle 是最好的选择,因为它可以将 python 对象序列化到磁盘,并且一切都是 python 中的对象。

def to_binary(self, folder: str):
    import os
    import pickle
    os.makedirs(folder, mode=0o777, exist_ok=True)
    with open(os.path.join(folder, self.name), mode='wb') as f:
        pickle.dump(self.data, f)                      
        
def from_binary(self, folder: str): 
    os.makedirs(folder, mode=0o777, exist_ok=True)
    with open(os.path.join(folder, self.name), mode='rb') as f:
        self.data = pickle.load(f)

不过,坦率地说,我不确定它的限制是什么。好像我可以用它来写一个字典到磁盘,一个字符串,任何香草python。但是其他对象呢?像熊猫数据框? (当然,这有保存到磁盘的内置方法,但是,作为示例,我的东西会在 DataFrame 对象上阻塞吗?)

你知道什么会破坏这个吗?如果是这样,是否有更通用的解决方案将数据保存到磁盘?


旁注,我可能想要使用它的另一个原因是用于“散列”目的。如果我得到一个不可散列的对象,理论上我可以使用 pickle 来获得一个可散列的字符流。只要它的序列化过程是确定性的,就足以满足我的目的。如果您发现此辅助问题有任何问题,请告诉我。

这类事情涉及的计算机科学概念比我真正理解的要深得多,因此非常感谢您的帮助!

【问题讨论】:

  • 当然,序列化 anything 是 pickles 应该能够做的,但这听起来像是糟糕设计的秘诀,而且哈希的事情听起来更糟糕(酸洗不是t 必须是确定性的)。是什么需要将任何东西序列化到磁盘上?如果序列化的内容是特定于进程或进程状态的怎么办?
  • “Serialize ANYTHING”实际上没有意义 - 并非每个对象都代表对序列化有意义的东西。没有 100% 通用的绝对序列化任何对象机制。
  • @Ry- 我希望为我的基类提供尽可能通用的解决方案,我认为它会作为最后的手段使用,因为许多事物都有更好的方法将数据保存到磁盘。因此,在这个系统中,序列化到磁盘几乎总是与上下文相关,但如果特定解决方案尚不可用,我希望有一个备用解决方案。感谢您对泡菜散列的评论。现在我有一个时间戳解决方案,但我认为散列是理想的,我只是找不到能够散列任何东西的解决方案,我猜泡菜也不是。谢谢!

标签: python pickle


【解决方案1】:

根据我的经验,tensorflow 库在没有可腌制对象方面存在一些问题。例如,请参阅 this github 问题。

我其实不知道这个问题到底是从哪里来的,但绝对是一个反面的例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2016-03-08
    相关资源
    最近更新 更多