要限制内存副本的数量,您可以尝试将
joblib 的开发版本已得到改进,可将内存映射用于大型输入数组。这可能会解决您的问题。
我的sklearn版本是0.14.1,在linux Debian GNU/Linux 7.1上使用python 2.7
叫:
clf = RandomForestClassifier(min_samples_split = 10, n_estimators = 50 , n_jobs = 1) is ok
通话时:
clf = RandomForestClassifier(min_samples_split = 10, n_estimators = 50 , n_jobs = 5)
clf.fit(train.toarray(), targets)
引发以下异常:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 552, in bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 505, in run
self.target(self.__args, *self.__kwargs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 342, in handletasks
put(task)
SystemError: NULL result without error in PyObject_Call
抛出异常后,随机森林的所有进程全部被阻塞
根据形状信息,数据集应为 ~4GB(对于单精度浮点数(。此异常可能是由多处理序列化数据以将其传递给工作进程时内存耗尽引起的。
sklearn/externals/joblib
文件夹替换为符号链接或 joblib 存储库的主分支的 joblib
子文件夹的副本:https://github.com/joblib/joblib编辑内存映射支持已登陆joblib 0.8+,默认情况下包含在scikit-learn 0.15+中