我有一个正在处理项目的应用程序。这些项目目前存储为pickle,使用
生成cPickle.dump(project, open(filename, 'wb'), HIGHEST_PROTOCOL)
这些项目文件需要是可扩展的,因为它们在版本控制环境中使用。 问题是,如果我序列化完全相同的对象,那么pickle每次都会变得不同。 0作为协议工作,但我需要文件更小(协议0约为12MB)。
答案 0 :(得分:0)
我找到了解决方案,如果有人在将来有同样的问题,我会在这里发布。
解决方案是在对象进行酸洗之前直接对对象进行深度检查。
这样,当使用HIGHEST_PROTOCOL时,显然导致差异的引用计数被重置并且文件结果相同。
而不是
cPickle.dump(instance, open(filename, 'wb'), HIGHEST_PROTOCOL)
你需要这样做:
from copy import deepcopy
cpy = deepcopy(instance)
cPickle.dump(cpy, open(filename, 'wb'), HIGHEST_PROTOCOL)
cpy = None
这样,文件大小显着减少,同时仍保持可比性。