保存scikit-learn分类器导致内存错误

5
我的机器有16G的内存,训练程序最多使用2.6G的内存。但是当我想把使用大型数据集训练的分类器(使用sklearn.svm.SVC)保存为pickle文件时,它消耗了太多内存,我的机器不能提供足够的内存。请问是否有其他替代方法可以保存分类器。
我尝试过:
- picklecPickle - 以wwb方式写入 - 设置fast = True 但是这些都不起作用,总是会引发MemoryError。偶尔会成功保存文件,但加载时会引发ValueError: insecure string pickle
谢谢!更新:谢谢大家。我没有尝试过joblib,在设置protocol=2后它可以工作。

这很奇怪。尽管我写过类似大小的转储文件,但从未发生过这种情况。有趣的是,“偶尔”文件会被存储。由于您有16G的RAM,您可以尝试使用cPickle.dumps()并查看实际获得的字符串长度是多少? 此外,当您尝试从尚未关闭的文件中读取时,会出现“不安全的字符串pickle”错误。 - hrs
@hrs 这次我成功地保存了文件,大约有2G。不知道为什么程序使用了超过50%的内存来保存它。可能有时候内存被其他程序占用,所以剩下的不够用。我会再试一次看看会发生什么。关于“不安全的字符串pickle”错误,我正在使用“with”打开文件,实际上在读取之前该程序已经关闭了。 - iceboal
cPickle.dump将对象复制到字符串中,然后写入文件。这可能是它占用过多内存的原因。 - hrs
尝试使用joblib.dump进行数据序列化,相比标准的pickle,它对于大型NumPy数组应该更加智能。 - Fred Foo
@larsmans 我在使用 joblib.dump(model,file,compress=3) 时遇到了一个非常严重的 MemoryError。这个 scikit-learn 模型是一个包含数千棵树的随机森林。我将尝试使用 compress=2 - visoft
编辑:“compress=2”失败了,因为在joblib.v8.4中不可用。我不想通过手动安装9.3来破坏scikit-learn。 - visoft
1个回答

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接