如何计算COO格式稀疏矩阵的内存占用?现有方案存在问题
COO稀疏矩阵内存占用计算的正确方式
嘿,这个问题我之前踩过坑,刚好能给你捋清楚!
首先得明确:COO格式的稀疏矩阵和CSR/CSC格式的存储结构完全不一样——你查到的mat.data.nbytes + mat.indptr.nbytes + mat.indices.nbytes是给CSR/CSC矩阵用的公式,COO矩阵根本没有indptr和indices这两个属性,所以用它肯定会报错。
COO矩阵的核心存储逻辑是三个一维数组:
data:存储所有非零元素的具体值row:存储每个非零元素对应的行索引col:存储每个非零元素对应的列索引
所以正确的内存占用计算应该是这三个数组的内存总和:
total_memory = mat.data.nbytes + mat.row.nbytes + mat.col.nbytes
你之前只算mat.data.nbytes结果远小于实际值,就是因为漏掉了row和col这两个索引数组的内存。尤其是当你从DataFrame列创建大型稀疏矩阵时,非零元素数量庞大,这两个索引数组的内存占比其实相当可观,绝对不能忽略。
拿你的示例代码验证一下:
假设你的row、col、data都是numpy默认的int64类型,每个数组长度是7,那每个数组的内存是7 * 8 = 56字节,三个加起来就是56*3=168字节,这才是这个COO矩阵的完整内存占用。
另外补充一句:如果之后需要把COO转成CSR/CSC格式,那时候再用data + indices + indptr的公式就没问题了,但COO格式一定要认准row、col、data三个核心组件哦!
内容的提问来源于stack exchange,提问作者safex
相关产品推荐
相关产品推荐

