为啥 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) 的大小不同?如何将变量保存到文件文件?的主要内容,如果未能解决你的问题,请参考以下文章

Python中Pickle模块的dump()方法和load()方法

Python列表/字典的保存与加载(pickle)

Python pickle模块

python保存字典和读取字典pickle

python pickle

pickle模块的基本使用