大规模数据集下基于余弦相似度的用户-商品向量匹配系统优化与落地咨询
大规模数据集下基于余弦相似度的用户-商品向量匹配系统优化与落地咨询
我正在开发一个基于Python和NumPy的系统,通过余弦相似度计算用户向量与商品向量之间的匹配度。当前代码在小数据集上运行正常,但面对百万级别的用户和商品时,性能和内存占用都开始拉胯了,尤其是点积计算和内存消耗这两块,成了明显的瓶颈。
我已经尝试过的优化方向
- 用
np.argsort查找最相似的商品,但矩阵规模一大就变得异常缓慢 - 尝试过通过重塑和广播处理用户元数据,但内存占用会随着数据集规模暴涨,根本扛不住
当前代码实现
import time from numpy.linalg import norm import numpy as np start_time = time.time() # 计算商品与用户向量的点积 dot_pdt_vectors = (product_catalog_emb_vector @ user_emb_vector.T).T # 计算商品向量的范数 product_vector_norm = norm(product_catalog_emb_vector, axis=1) # 计算用户向量的范数 user_vector_norm = norm(user_emb_vector, axis=1) # 计算余弦相似度 similarity = ( dot_pdt_vectors / (product_vector_norm * user_vector_norm[:, np.newaxis]) ) cosine_distance_vector = 1 - similarity # 筛选最相似的前50个商品 product_recommended_idx = ( np.argsort(cosine_distance_vector, axis=1)[:, :50] ) product_recommended_vector = product_catalog_vector[product_recommended_idx] # 处理用户元数据并拼接 bq, r, _ = product_recommended_vector.shape user_data_vector = ( np.repeat( user_metadata_vector, r, axis=0 ).reshape( bq, r, user_metadata_vector.shape[-1] ) ) # 拼接用户元数据和推荐商品向量 product_recommended_vector = np.concatenate( (user_data_vector, product_recommended_vector), axis=2 ) cols_pr_v = product_recommended_vector.shape[-1] # 重塑最终输出向量 product_recommended_vector = ( product_recommended_vector.reshape(-1, cols_pr_v) ) logger.info( f'Product Recommended Vector Succesfully Created: {product_recommended_vector.shape}' ) logger.info( f'Function execution time: {(time.time() - start_time):.4f} seconds' )
我需要的帮助
性能优化
如何优化余弦相似度的计算逻辑,同时降低内存占用?比如是否应该考虑稀疏矩阵、批量处理,或者换用其他更高效的算法?
内存高效处理
有没有更省内存的方式来处理这些嵌入向量?比如用np.memmap,或者Dask这类分布式框架?
横向扩展
怎么把这套逻辑扩展到百万级别的用户和商品规模,还能保持高效运行?
核心问题其实是:面对大规模稠密矩阵,做这类计算的最优方案是什么?还有哪些替代思路可以探索?
任何针对大规模数据场景的代码优化建议都非常感谢!
感谢大家的帮助!
备注:内容来源于stack exchange,提问作者SanchoH
相关产品推荐
相关产品推荐

