首页 > 解决方案 > Python 处理字节相关对象的内存使用情况

问题描述

背景

目前,我正在压缩一个包含九个变量的numpy数组和另一个大小为110的numpy数组(大小是恒定的,例如,这个对象的每个实例都包含九个变量和一个numpy数组大小为 110)。九个变量由浮点数和整数的混合组成,而对象内的 numpy 数组也具有整数值。我随机抽取了一个样本,试图找出物体的实际大小。我没有使用

sys.getsizeof()

由于如果存在嵌套对象,此方法似乎无法可靠地获取对象的实际大小,因此我使用 pymler 计算对象的大小,结果如下:

print("Size before compression: {}".format(asizeof.asizeof(object) ))
Size before compression: 25200

问题一

我所做的下一步是将对象分成两部分:一部分包含九个变量,另一部分包含 numpy 数组。当我尝试检查这两个对象的内存使用情况时,我得到了以下结果:

print('Size waveform before compression: {}'.format(asizeof.asizeof(np_array)))
112

print('Size other variables before compression: {}'.format(asizeof.asizeof(other_vars)))
96

我的问题是:

问题二

我压缩了这两个对象(在这种情况下,我使用了 Pylzma)并收到了这些值:

print('Size waveform after compression: {}'.format(asizeof.asizeof(compressed_np_array)))
Size waveform after compression: 5808
print('Size other variables after compression: {}'.format(sys.getsizeof(compressed_vars)))    
Size other variables after compression: 7818

这似乎更合理,但是,当我将两个对象组合起来接收一个字节对象时,我得到的内存使用量与我预期的不同,例如:

compressed_record = compressed_vars + compressed_np_array
print("Size after compression: {}".format(asizeof.asizeof(compressed_object)))
Size after compression: 13592

我期待整个对象是 13626 而不是实际值 13592。

提前感谢您阅读/回答我的问题,我很乐意在必要时提供更多信息

标签: pythonpython-3.xnumpymemorybyte

解决方案


我不是 100% 确定您的对象是或bytes类型(可能是因为它们是压缩模块的输出),但预计添加 2 字节对象会减小大小。

import sys

a = b'hellow world'
b = b'how are you?'


print(sys.getsizeof(b''))
print(sys.getsizeof(a))
print(sys.getsizeof(b))
print(sys.getsizeof(a+b))

结果:

33
45
45
57

你看,“合并的”对象是57字节长,每个对象45在添加之前都是字节长。那是因为真实数据要小得多,您不会认为这bytes是一个具有属性的对象。看,一个空bytes对象的大小33在我的系统上。

因此,通过添加 2 个字节的对象,我摆脱了一组非数据(对象属性,例如大小),并且生成的对象略小。

无论如何,您的数据足够大,可以忽略这种差异。但是当使用很多小对象时,这种开销会消耗大量内存(就像我上面的例子一样)


推荐阅读