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

How to speed up dill serialization to store Python object to file

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

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

当运行在4GB内存MacAir上时,有没有更有效的方法来存储这样的对象?

这是一个不可思议的工具。我不确定是否可以调整任何参数来帮助解决我的低内存问题。我知道 pickle 有一个 protocol=2 但它似乎不像 dill 那样存储环境。

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

看这个:

>>>  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' 的大小只是字典对象本身的大小(class、方法、键和字典的整体结构)以及一个指针 到 'x'。它根本不包括 'x' 的大小。

然而,当您序列化 'd' 时,它必须同时序列化 'd' 'x' 才能反序列化稍后变成有意义的字典。这就是为什么你的文件比你的电话字节大的基础。你可以看到,序列化程序实际上很好地打包了它。

我是 dill 作者。在这里查看我的评论:If Dill file is too large for RAM is there another way it can be loaded。简而言之,答案是这取决于您正在酸洗的内容……如果是 class 个实例,那么答案是肯定的。尝试 byref 设置。此外,如果您要存储 dict 个对象,您可能希望通过使用 kleptodict 映射到一个文件目录——这样您就可以转储和加载单个对象dict 的各个元素,仍然可以从 dict API.

中计算出来

因此,尤其是在使用 dill 时,尤其是在 ipynb 中,请查看 dill.settings... 序列化(dillpickle 或其他)递归拉动物件入泡菜,如此常能拉入所有globals。使用 dill.settings 更改通过引用存储的内容和通过 pickling 存储的内容。