【发布时间】: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- 我希望为我的基类提供尽可能通用的解决方案,我认为它会作为最后的手段使用,因为许多事物都有更好的方法将数据保存到磁盘。因此,在这个系统中,序列化到磁盘几乎总是与上下文相关,但如果特定解决方案尚不可用,我希望有一个备用解决方案。感谢您对泡菜散列的评论。现在我有一个时间戳解决方案,但我认为散列是理想的,我只是找不到能够散列任何东西的解决方案,我猜泡菜也不是。谢谢!