如何加快dill序列化以将Python对象存储到文件中

时间:2015-10-16 21:45:27

标签: python serialization storage pickle dill

在文档中说sys.getsizeof()的输出以字节为单位。我正在尝试存储一个数据结构,它是类实例和列表的字典。我在这个类实例字典上做了sys.getsizeof(),它是3352字节。我正在使用莳萝对它进行序列化,所以我可以稍后加载它,但这需要花费很长时间。

文件大小已经是260 MB,远远大于sys.getsizeof()指定的3352字节。有谁知道为什么价值观不同以及为什么需要这么长时间存储?

在4GB内存Mac Air上运行时,是否有更有效的方法来存储这样的对象?

这是一个令人难以置信的工具。我不确定是否有任何参数我可以调整以帮助解决我的低内存问题。我知道pickle有一个协议= 2,但它似乎不存储环境和莳萝。

sys.getsizeof(D_storage_Data) #Output is 3352
dill.dump(D_storage_Data,open("storage.obj","wb"))

2 个答案:

答案 0 :(得分:3)

注意:

>>>  x = [ i for i in range(255) ]
>>>  sys.getsizeof(x)
2216
>>>  d = { 1 : x }
>>>  sys.getsizeof(d)
288
>>>  s = pickle.dumps(d) # Dill is similar, I just don't have it installed on this computer
>>>  sys.getsizeof(s)
557

' d'只是dict对象本身的大小(类,方法,键和dict的整体结构)以及指针到' x'。它不包括' x'的大小。一点都不。

当你序列化' d'但是,它必须序列化两个' d' ' x'为了能够在以后反序列化成有意义的词典。这是您的文件大于调用字节的基础。你可以看到,序列化器实际上很好地打包了它。

答案 1 :(得分:3)

我是dill作者。请在此处查看我的评论:If Dill file is too large for RAM is there another way it can be loaded。简而言之,答案是它取决于你正在腌制的东西......如果它是类实例,答案是肯定的。尝试byref设置。此外,如果您要存储dict个对象,您可能希望使用dictklepto映射到文件目录 - 这样您就可以转储和加载个人单独的dict元素,仍然可以使用dict API。

所以特别是在使用dill时,特别是在ipynb中,请查看dill.settings ...序列化(dillpickle或其他方式)以递归方式将对象拉入泡菜,往往可以拉入globals的全部。使用dill.settings更改参考存储的内容以及酸洗存储的内容。