合并稠密向量(词嵌入)与稀疏向量(独热编码)时内核崩溃求助
内核崩溃原因与解决方案
核心问题:内存耗尽
你的代码中sparse_features.toarray()会把稀疏矩阵转成稠密数组,而这个数组的规模是203621 × 70939 ≈144亿个元素。就算用float32类型存储,也需要约57GB内存,远超普通机器的内存容量,直接导致内存耗尽,内核崩溃。
优化方案
方案1:用稀疏矩阵格式拼接(推荐)
无需将稀疏特征转成稠密数组,把稠密向量转成稀疏矩阵后,直接用稀疏矩阵拼接方法,全程保持稀疏格式,内存占用极低。
from scipy.sparse import hstack, csr_matrix def combine_sparse_and_dense_features(dense_vectors, sparse_features): # 将稠密向量列转换为稀疏矩阵 dense_sparse = csr_matrix(np.stack(dense_vectors.values)) # 横向拼接稀疏矩阵 combined_sparse = hstack([dense_sparse, sparse_features]) return combined_sparse # 调用示例 dense_vectors = X_train['word_embedding'] sparse_features = X_train_ohe combined_vectors = combine_sparse_and_dense_features(dense_vectors, sparse_features) # 若后续确实需要稠密数组(谨慎操作),可按需转换 # combined_dense = combined_vectors.toarray()
方案2:优化稠密向量的处理逻辑
你原代码中list(dense_vectors)再转array的操作冗余,直接用np.stack()即可将向量列转换为标准numpy数组,减少不必要的内存开销:
# 替代原代码中ar1的生成逻辑 ar1 = np.stack(dense_vectors.values)
方案3:分批处理(仅当必须得到稠密数组时使用)
如果业务要求必须输出完整的稠密数组,可分批次处理并将结果保存到磁盘,避免一次性占用大量内存:
import numpy as np def process_batch(dense_batch, sparse_batch): dense_arr = np.stack(dense_batch.values) sparse_arr = sparse_batch.toarray() return np.concatenate([dense_arr, sparse_arr], axis=1) # 按批次处理 batch_size = 10000 total = len(X_train) for idx in range(0, total, batch_size): dense_batch = X_train['word_embedding'].iloc[idx:idx+batch_size] sparse_batch = X_train_ohe[idx:idx+batch_size] combined_batch = process_batch(dense_batch, sparse_batch) # 保存批次结果到本地 np.save(f'combined_feature_batch_{idx//batch_size}.npy', combined_batch)
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

