我的对象泡菜转储意外巨大。我想调查哪个属性导致了这个问题。我该怎么做?
我已经尝试了sys.getsizeof
和pympler.asizeof
,他们没有给我答案。
这个问题更多的是一般方法,但如果你真的想知道,我的目标是一个sklearn训练的逻辑回归模型。我的pickle转储是500MB,但dir(model)
中没有一个属性反映它:
import sys
from pympler.asizeof import asizeof
for a in dir(clf):
print('%25s\t%10d\t%10d' %(a, sys.getsizeof(getattr(clf, a)), asizeof(getattr(clf, a))))
C 28 32
__class__ 1464 0
__delattr__ 56 56
__dict__ 648 8944
__dir__ 72 0
__doc__ 8359 8360
__eq__ 56 56
__format__ 72 0
__ge__ 56 56
__getattribute__ 56 56
__getstate__ 64 0
__gt__ 56 56
__hash__ 56 56
__init__ 64 0
__init_subclass__ 72 0
__le__ 56 56
__lt__ 56 56
__module__ 78 80
__ne__ 56 56
__new__ 72 0
__reduce__ 72 0
__reduce_ex__ 72 0
__repr__ 64 0
__setattr__ 56 56
__setstate__ 64 0
__sizeof__ 72 0
__str__ 56 56
__subclasshook__ 72 0
__weakref__ 16 16
_estimator_type 59 64
_get_param_names 64 0
_predict_proba_lr 64 0
class_weight 16 16
classes_ 6536 6536
coef_ 112 112
decision_function 64 0
densify 64 0
dual 24 24
fit 64 0
fit_intercept 28 32
get_params 64 0
intercept_ 96 96
intercept_scaling 28 32
max_iter 28 32
multi_class 52 56
n_iter_ 100 104
n_jobs 28 32
penalty 51 56
predict 64 0
predict_log_proba 64 0
predict_proba 64 0
random_state 16 16
score 64 0
set_params 64 0
solver 58 64
sparsify 64 0
tol 24 24
verbose 24 24
warm_start 24 24
我的训练数据大约在500MB左右,所以我猜它是在某处不必要地捕获的,我想在保存到文件时删除它。请注意,它并不那么明显,因为在将结果输入分类器(不是管道的一部分)之前,我确实有一些预处理sklearn管道
更新2:
一些代码,简化了我的实际公司代码:
clf = LogisticRegression(penalty="l2", C=100)
clf.fit(X, target)
with open(filepath, 'wb') as f:
pickle.dump(clf, f)
让我知道您认为可能有用的其他信息。