为何含不同维度numpy向量的两个Python字典占用相同内存?
为什么两个不同维度numpy数组的字典加载后
sys.getsizeof()返回相同值? 这是因为sys.getsizeof()只计算容器对象本身的内存占用,不包含它引用的所有子对象的内存——这里的字典就是容器,它里面存的只是键字符串和numpy数组对象的引用,而非数组的实际数据。
具体原因拆解:
- 字典的内存开销:字典本身的大小取决于它的哈希表结构、键值对的数量,每个键值对里的引用在64位系统上固定是8字节(不管引用的对象多大)。你的两个字典键完全相同、键值对数量一致,所以字典本身的内存占用自然一样。
- numpy数组的内存:数组的实际数据存在单独的内存块里,
sys.getsizeof()返回的字典大小不会包含这部分数据。要查看数组的实际内存占用,得用np.ndarray.nbytes属性,或者直接对数组调用sys.getsizeof()(后者会包含数组对象本身的元数据+数据内存)。
如何计算字典的总内存占用?
如果你想得到整个字典(包括所有键和数组数据)的真实内存使用量,需要递归计算所有子对象的大小:
import sys import numpy as np def calculate_total_memory(obj): # 先计算对象本身的内存大小 total_size = sys.getsizeof(obj) if isinstance(obj, dict): # 遍历所有键和值,累加它们的内存占用 for key, value in obj.items(): total_size += calculate_total_memory(key) total_size += calculate_total_memory(value) # 可扩展处理其他容器类型,比如列表、元组等 return total_size # 测试使用 with open("big.pickle", 'rb') as f: source = pickle.load(f) print(calculate_total_memory(source))
为什么文件大小不同?
你的两个pickle文件大小差异是因为它们存储了数组的实际二进制数据:300维的float数组每个占用的字节数是150维的2倍(假设是同一种float类型,比如float32的话,3004=1200字节,1504=600字节),所以总文件大小接近2倍关系,这和你看到的4.3GB vs 2.2GB是一致的。而加载到内存后,字典本身的引用大小不随数组维度变化,所以sys.getsizeof(source)返回相同值。
内容的提问来源于stack exchange,提问作者Slowpoke
相关产品推荐
相关产品推荐

