0

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

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

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

这是一个不可思议的工具。我不确定是否有任何参数可以调整以帮助解决我的内存不足问题。我知道泡菜有一个协议=2,但它似乎不像莳萝那样存储环境。

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

2 回答 2

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”,以便以后能够反序列化为有意义的字典。这就是为什么你的文件比你调用的字节大的基础。你可以看到,序列化程序实际上很好地打包了它。

于 2015-10-17T00:55:21.563 回答
3

我是dill作者。请在此处查看我的评论:如果 Dill 文件对于 RAM 来说太大,是否还有另一种方法可以加载它。简而言之,答案是这取决于你在腌制什么……如果是类实例,答案是肯定的。尝试byref设置。此外,如果您正在寻找存储dict对象,您可能希望dict通过使用将您映射到文件目录klepto- 这样您可以单独转储和加载 dict 的各个元素,并且仍然可以使用dictAPI。

因此,尤其是在使用ipynb 时dill,尤其是在 ipynb 中,请检查dill.settings...序列化(dillpickle或其他方式)递归地将对象拉入泡菜中,因此通常可以拉入所有globals. 用于dill.settings更改通过引用存储的内容和通过酸洗存储的内容。

于 2015-10-17T01:54:20.980 回答