如何解决来自导入类的对象的 cloudpickle 与在发生酸洗的同一模块中定义的类
我注意到由 cloudpickle.dump(obj) 生成的 pickle 文件是不同的,这取决于 obj 的类(称为 SubClass,BaseClass 的子类)是在与 cloudpickling 发生的同一模块中导入或定义的。
特别是,如果导入了 BaseClass 和 SubClass,那么 pickle 文件只存储对 MyClass 模块和类的引用,这由反汇编字节码决定。
如果 BaseClass 和 SubClass 定义在发生 cloudpickling 的同一模块中,那么pickle 文件似乎存储了 BaseClass 和 SubClass 的代码。
有谁知道为什么会这样?这是因为cloudpickle在主模块中定义时,会将对象及其类完全序列化吗?
BaseClass 和 SubClass 定义在与 cloudpickling 发生的相同模块中:
import cloudpickle
import pickletools
class BaseClass:
def func(self):
print("BaseClass")
class SubClass(BaseClass):
def subfunc(self):
print("SubClass")
obj = SubClass()
with open("cloudpickle_object.pkl","wb") as f:
cloudpickle.dump(obj,f)
with open("cloudpickle_object.pkl","rb") as infile:
pickletools.dis(infile)
反汇编器的输出显示了pickle文件中的BaseClass和SubClass代码:
83: \x8c SHORT_BINUNICODE 'SubClass'
93: \x94 MEMOIZE (as 6)
94: h BINGET 2
96: ( MARK
97: h BINGET 5
99: \x8c SHORT_BINUNICODE 'BaseClass'
110: \x94 MEMOIZE (as 7)
111: h BINGET 3
113: \x8c SHORT_BINUNICODE 'object
从不同的模块导入的 BaseClass 和 SubClass 作为 cloudpickling 发生的地方:
import cloudpickle
import pickletools
from myclass import SubClass
obj = SubClass()
with open("cloudpickle_object.pkl","rb") as infile:
pickletools.dis(infile)
仅引用 SubClass 的输出,没有 BaseClass 或代码:
0: \x80 PROTO 4
2: \x95 FRAME 27
11: \x8c SHORT_BINUNICODE 'myclass'
20: \x94 MEMOIZE (as 0)
21: \x8c SHORT_BINUNICODE 'SubClass'
[...]
解决方法
cloudpickle
仅序列化属于 __main__
模块一部分的对象,如其 github https://github.com/cloudpipe/cloudpickle 所述。
因此,使用导入的 pickle 对象更小是很自然的,因为这些对象在 unpickling 时会被导入。
有趣的是,有一些功能请求和一些工作已经完成,使 cloudpickle 序列化一些导入的模块。例如,
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。