在文档中说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"))
答案 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
个对象,您可能希望使用dict
将klepto
映射到文件目录 - 这样您就可以转储和加载个人单独的dict元素,仍然可以使用dict
API。
所以特别是在使用dill
时,特别是在ipynb中,请查看dill.settings
...序列化(dill
,pickle
或其他方式)以递归方式将对象拉入泡菜,往往可以拉入globals
的全部。使用dill.settings
更改参考存储的内容以及酸洗存储的内容。