Python 如何pickle文件>;2 GiB,将其拆分为更小的碎片
我有一个大于2 GiB的分类器对象,我想对其进行pickle,但我得到了以下结果:Python 如何pickle文件>;2 GiB,将其拆分为更小的碎片,python,python-2.7,pickle,Python,Python 2.7,Pickle,我有一个大于2 GiB的分类器对象,我想对其进行pickle,但我得到了以下结果: cPickle.dump(clf,fo,protocol=cPickle.HIGHEST\u protocol) 溢出错误:无法序列化大于2 GiB的字符串 我发现这个问题也有同样的问题,有人建议 使用Python3协议4-不可接受,因为我需要使用Python2 使用pyocser导入ocdumps、ocloads中的-不可接受,因为我不能使用其他(非普通)模块 将对象拆分为字节并pickle每个片段 有没有一种
cPickle.dump(clf,fo,protocol=cPickle.HIGHEST\u protocol)
溢出错误:无法序列化大于2 GiB的字符串
我发现这个问题也有同样的问题,有人建议
-不可接受,因为我不能使用其他(非普通)模块
我的代码:
from sklearn.svm import SVC
import cPickle
def train_clf(X,y,clf_name):
start_time = time.time()
# after many tests, this was found to be best classifier
clf = SVC(C = 0.01, kernel='poly')
clf.fit(X,y)
print 'fit done... {} seconds'.format(time.time() - start_time)
with open(clf_name, "wb") as fo:
cPickle.dump(clf, fo, protocol = cPickle.HIGHEST_PROTOCOL)
# cPickle.HIGHEST_PROTOCOL == 2
# the error occurs inside the dump method
return time.time() - start_time
在此之后,我想取消勾选并使用:
with open(clf_name, 'rb') as fo:
clf, load_time = cPickle.load(fo), time.time()
您可以使用sklearn.external.joblib,如果模型大小较大,它会自动将模型文件拆分为pickled numpy数组文件
from sklearn.externals import joblib
joblib.dump(clf, 'filename.pkl')
更新:sklearn将显示
弃用警告:sklearn.externals.joblib在0.21中弃用,将在0.23中删除。请直接从joblib导入此功能,该功能可以通过以下方式安装:pip install joblib。如果在加载pickle模型时引发此警告,则可能需要使用scikit learn 0.21+重新序列化这些模型
所以用这个代替
import joblib
joblib.dump(clf, 'filename.pkl')
以后可以使用以下方法取消勾选:
clf = joblib.load('filename.pkl')
是来自scikit learn的SVC吗?@EliKorvigo是的。在代码段中添加了它为什么不使用:from sklearn.externals import joblib;joblib.dump(clf,'filename.pkl')@AlokNayak我对它不熟悉。看起来好多了,我现在就试试。我将在24小时后回来(拟合需要永远的时间)您应该为scikit学习对象使用joblib,因为它与pickle不同,单独处理numpy数组。或者像导入joblib一样简单。@eli korvigo joblib()这个joblib是否与“from sklearn.externals import joblib”相同?可能有一些特定于sklearn的代码修改,我不确定。顺便说一句,我看到在这个
joblib.dump(clf,'filename.pkl')
过程中只保存了一个文件,可以吗?每个numpy数组不应该单独保存吗?@CIsForCookies没关系,joblib
在必要时保存多个文件(您可以指定压缩级别以始终保存单个文件)。@AlokNayak序列化没有什么特别之处,尽管他们为其他joblib功能(最显著的是并行化)实现了额外的包装器.