使用KMeans聚类12万条数据时遭遇malloc错误求助
scikit-learn KMeans处理12万条数据触发malloc错误的排查方案
问题背景
处理约12万条二维(BMI、Episode_Count)数据时,KMeans聚类触发malloc内存释放错误,错误信息如下:
python3(2830,0x70000d545000) malloc: *** error for object 0xc0: pointer being freed was not allocated python3(2830,0x70000e54b000) malloc: *** error for object 0xc0: pointer being freed was not allocated ... [1] 2830 abort python3 kmeans.py
数据为二维float类型ndarray,此前同一数据集运行各类监督模型无异常。
排查与解决方案
1. 禁用多线程规避内存冲突
KMeans默认启用多线程并行计算,部分环境(如macOS)下易出现多线程内存释放异常,强制单线程运行:
# 旧版scikit-learn使用n_jobs控制线程数 kmeans = KMeans(n_clusters=k, random_state=42, n_jobs=1) # scikit-learn >=0.23版本可改用n_init='auto'结合单线程逻辑 # kmeans = KMeans(n_clusters=k, random_state=42, n_init='auto')
2. 统一数据类型
底层C代码对数据类型敏感,强制转换为标准float64类型:
X = df[['BMI','Episode_Count']].values.astype(np.float64)
3. 更新scikit-learn到最新稳定版
旧版本KMeans存在内存管理bug,尤其是多线程场景下的内存释放问题,执行更新:
pip install --upgrade scikit-learn
4. 改用MiniBatchKMeans
针对大数据量优化的MiniBatchKMeans内存占用更低,可避开全量KMeans的潜在内存问题:
from sklearn.cluster import MiniBatchKMeans kmeans = MiniBatchKMeans(n_clusters=k, random_state=42) y_pred = kmeans.fit_predict(X)
5. 检查数据异常值
极端值可能触发KMeans计算时的内存异常,执行检查:
print("是否存在无穷值:", np.isinf(X).any()) print("是否存在空值:", np.isnan(X).any())
若存在异常值,可通过截断或移除处理。
6. 减少初始化次数测试
默认n_init=10(多次初始化取最优结果),减少初始化次数可排查是否为初始化阶段的内存问题:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=1)
原始代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import KMeans df = pd.read_csv('data/final_dataset.csv') df = df[df['Episode_Count'].notna()] X = df[['BMI','Episode_Count']].values plt.scatter(X[:,0],X[:,1]) plt.show() k = 5 kmeans = KMeans(n_clusters=k, random_state=42) y_pred = kmeans.fit_predict(X) print(y_pred)
内容的提问来源于stack exchange,提问作者John Conor
相关产品推荐
相关产品推荐

