You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:15:43