为何从np.ndarray创建的scipy稀疏矩阵内存显示仅为48字节?
关于Scipy稀疏矩阵sys.getsizeof返回固定48字节的原因
问题背景
从事科学计算研究时,需处理大型密集矩阵:单任务要创建60个60000×60000的np.complex128类型矩阵,仅对角线60000个元素为0。因16GB内存不足,尝试用Scipy稀疏矩阵优化,发现转换为csc_matrix后,sys.getsizeof()始终返回48字节,即使扩大矩阵规模也不变。已验证稀疏矩阵与原密集矩阵的数值完全一致,现解释该现象原因。
核心原因
sys.getsizeof()仅统计Python对象本身的内存占用,而Scipy稀疏矩阵(如csc_matrix)的核心数据(非零元素值、行索引、列指针)都存储在内部的Numpy数组中,这些数组的内存并不会被sys.getsizeof()计入。
csc_matrix对象本质只是一个轻量级容器,仅包含指向内部数组的引用、矩阵形状、存储格式等元数据,这些元数据的内存占用很小,因此不管矩阵规模多大,sys.getsizeof()返回的数值基本固定(约48字节)。
查看稀疏矩阵实际内存占用
要获取稀疏矩阵真实的内存消耗,需统计其内部存储数组的内存总和:
# 计算csc_matrix实际占用内存 actual_memory = C.data.nbytes + C.indices.nbytes + C.indptr.nbytes print(actual_memory)
以测试代码中的n=1000为例:
C.data存储999000个complex128元素,每个占16字节,共999000*16=15984000字节C.indices存储非零元素的行索引,默认是int32类型,共999000*4=3996000字节C.indptr存储列指针,共1001个int32元素,共1001*4=4004字节
三者总和约19984004字节,远大于sys.getsizeof()返回的48字节,这才是稀疏矩阵实际占用的内存。
测试代码与输出
测试代码
import numpy as np from scipy.sparse import csc_matrix import sys n = 1000 A = np.random.uniform(1.0, 10.0, size=(n, n)) + 1j*np.random.uniform(1.0, 10.0, size=(n, n)) np.fill_diagonal(A, 0) C = csc_matrix(A) print(sys.getsizeof(A)) print(sys.getsizeof(C))
输出
16000128 48
稀疏矩阵信息
<1000x1000 稀疏矩阵,类型为 '<class 'numpy.complex128'>',采用压缩稀疏列(Compressed Sparse Column)格式存储,包含999000个非零元素>
内容的提问来源于stack exchange,提问作者gradctp
相关产品推荐
相关产品推荐

