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

如何加速dill序列化以将Python对象存储到文件,python,serialization,storage,pickle,dill,Python,Serialization,Storage,Pickle,Dill,文档中说sys.getsizeof()的输出以字节为单位。我试图存储一个数据结构,它是类实例和列表的字典。我在这个类实例字典上做了sys.getsizeof(),它是3352字节。我正在用dill序列化它,以便稍后加载,但这需要非常非常长的时间 文件大小已经是260 MB,远远大于sys.getsizeof()指定的3352字节。有人知道为什么值不同,为什么要花这么长时间来存储吗 在4GB内存Mac Air上运行时,有没有更有效的方法来存储这样的对象? 这是一个不可思议的工具。我不确定是否有任何

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

文件大小已经是260 MB,远远大于sys.getsizeof()指定的3352字节。有人知道为什么值不同,为什么要花这么长时间来存储吗

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

这是一个不可思议的工具。我不确定是否有任何参数可以调整以帮助解决内存不足的问题。我知道pickle有一个协议=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”的大小就是dict对象本身的大小(dict的类、方法、键和整体结构)以及指向“x”的指针。它根本不包括“x”的大小

但是,当序列化“d”时,它必须同时序列化“d”和“x”,以便以后能够反序列化为有意义的dict。这就是为什么文件比调用中的字节大的原因。您可以看到,序列化程序实际上在打包方面做得很好。

请注意:

>>>  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”,以便以后能够反序列化为有意义的dict。这就是为什么文件比调用中的字节大的原因。您可以看到,序列化程序实际上在打包方面做得很好。

我是dill的作者。请参见我的评论:。简言之,答案是它取决于你在酸洗什么……如果是类实例,答案是肯定的。尝试
byref
设置。另外,如果您希望存储对象的
dict
,您可能希望使用
klepot
,将
dict
映射到文件目录,这样您就可以单独转储和加载dict的各个元素,并且仍然使用
dict
API


因此,特别是在使用
dill
时,尤其是在ipynb中,请查看
dill.settings
。。。序列化(
dill
pickle
或其他)递归地将对象拉入pickle,因此通常可以拉入所有的
全局对象。使用
dill.settings
更改通过引用存储的内容和通过酸洗存储的内容。

我是
dill
的作者。请参见我的评论:。简言之,答案是它取决于你在酸洗什么……如果是类实例,答案是肯定的。尝试
byref
设置。另外,如果您希望存储对象的
dict
,您可能希望使用
klepot
,将
dict
映射到文件目录,这样您就可以单独转储和加载dict的各个元素,并且仍然使用
dict
API


因此,特别是在使用
dill
时,尤其是在ipynb中,请查看
dill.settings
。。。序列化(
dill
pickle
或其他)递归地将对象拉入pickle,因此通常可以拉入所有的
全局对象。使用
dill.settings
更改引用存储的内容和酸洗存储的内容。

请发布您的代码。刚刚发布。我用的是dill.dump,我想的更多的是D_存储数据的结构。您要求的是一种更有效的方法来存储数据结构,但您并没有说明数据结构是什么。您的数据结构是否包含任何函数、对象引用或类?您的结构中可能有任何自引用递归吗?听起来在序列化过程中动态生成了越来越多的数据。“我在类实例字典上创建了sys.getsizeof(),它是3352字节。”这是我的数据结构。我会在问题中说得更清楚。请发布你的代码。现在就发布。我用的是dill.dump,我想的更多的是D_存储数据的结构。您要求的是一种更有效的方法来存储数据结构,但您并没有说明数据结构是什么。您的数据结构是否包含任何函数、对象引用或类?您的结构中可能有任何自引用递归吗?听起来在序列化过程中动态生成了越来越多的数据。“我在类实例字典上创建了sys.getsizeof(),它是3352字节。”这是我的数据结构。我会在问题中说得更清楚。我最终在我的大学集群上运行,它在任何时候都能完美运行。与我在集群上运行文件时相比,我的文件变得如此之大,这很奇怪。我在ipython笔记本上运行它,它看起来好像有一个反馈循环,当我再次使用它时,这将非常有用。非常感谢迈克!这个模块太棒了。我最终在我的大学集群上运行,它在任何时候都能完美地工作。与我在集群上运行文件时相比,我的文件变得如此之大,这很奇怪。我在ipython笔记本上运行它,它看起来好像有一个反馈循环,当我再次使用它时,这将非常有用。非常感谢迈克!这个模块太棒了。