使用KMeans聚类计算WCSS时如何避免Windows MKL环境内存泄漏?
C:\Users\grahv\anaconda3\lib\site-packages\sklearn\cluster_kmeans.py:881: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.
该警告是Windows平台下MKL数学库与scikit-learn KMeans多线程调度冲突导致的,可按优先级选择以下方案解决:
方案1:代码内临时设置环境变量(最推荐,无全局影响)
在你的Python脚本最开头、导入scikit-learn之前添加如下代码即可:
import os os.environ["OMP_NUM_THREADS"] = "1" # 后面再导入sklearn相关包以及写业务代码
修改后的完整肘法计算代码示例:
import os os.environ["OMP_NUM_THREADS"] = "1" from sklearn.cluster import KMeans wcss = [] for i in range(1,10): kmeans = KMeans(n_clusters=i, n_init=10) # 手动指定n_init可同时规避新版sklearn的默认参数警告 kmeans.fit(x_scaled) wcss.append(kmeans.inertia_)
这个方案只会对当前运行的脚本生效,不会修改系统全局配置,也不会影响其他程序运行。
方案2:临时设置系统环境变量
如果不想修改代码,可在运行脚本前,在当前命令行窗口执行命令:set OMP_NUM_THREADS=1
执行后再在同一个窗口启动Python运行你的脚本即可,关闭命令行后该配置自动失效。
方案3:永久设置系统环境变量
如果你需要长期规避该问题,可在Windows系统环境变量中新增一条配置:
- 变量名:
OMP_NUM_THREADS - 变量值:
1
配置完成后重启命令行/IDE即可生效,注意该配置会全局生效,影响所有调用MKL库的程序。
补充说明
如果担心单线程影响运行效率,可根据你的CPU核心数将OMP_NUM_THREADS设置为小于等于4的数值,只要线程数不超过数据集分块数,就可以同时规避内存泄漏风险和保证运行效率,小数据集下单线程和多线程的运行速度几乎无差异。
内容的提问来源于stack exchange,提问作者Gromok

