为啥 pickle.dump(obj) 与 sys.getsizeof(obj) 的大小不同?如何将变量保存到文件文件?
Posted
技术标签:
【中文标题】为啥 pickle.dump(obj) 与 sys.getsizeof(obj) 的大小不同?如何将变量保存到文件文件?【英文标题】:Why pickle.dump(obj) has different size with sys.getsizeof(obj)? How to save variable to file file?为什么 pickle.dump(obj) 与 sys.getsizeof(obj) 的大小不同?如何将变量保存到文件文件? 【发布时间】:2013-10-31 05:41:03 【问题描述】:我使用 python 的 scikit lib 中的随机森林分类器来做我的练习。每次运行时,结果都会发生变化。所以我跑了 1000 次,得到了平均结果。
我将对象 rf 保存到文件中,以便以后通过 pickle.dump() 进行预测,每个文件大约 4MB。但是,sys.getsizeof(rf) 只给我 36 个字节
rf = RandomForestClassifier(n_estimators = 50)
rf.fit(matX, vecY)
pickle.dump(rf,'var.sav')
我的问题:
sys.getsizeof() 在获取 RandomForestClassifier 对象的大小时似乎是错误的,不是吗?为什么? 如何将对象保存在 zip 文件中以使其尺寸更小?【问题讨论】:
【参考方案1】:getsizeof()
为您提供只是对象的内存占用,而不是该对象引用的任何其他值。您还需要递归对象以查找所有属性的总大小,以及这些属性所包含的任何内容,等等。
Pickling 是一种序列化格式。序列化需要存储元数据以及对象的内容。内存大小和pickle大小只有一个粗略的相关性。
Pickles 是字节流,如果需要更紧凑的字节流,请使用压缩。
如果您将泡菜存储在 ZIP 文件中,您的数据将已经被压缩;在将泡菜存储到 ZIP 之前对其进行压缩在这种情况下将无济于事,因为已经压缩的数据在额外的 ZIP 压缩之后会冒着变得更大的风险,而不是由于元数据开销和典型压缩数据中缺乏重复数据.
【讨论】:
以上是关于为啥 pickle.dump(obj) 与 sys.getsizeof(obj) 的大小不同?如何将变量保存到文件文件?的主要内容,如果未能解决你的问题,请参考以下文章