Python处理字节相关对象的内存使用

2024-05-16 00:16:29 发布

您现在位置:Python中文网/ 问答频道 /正文

背景

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

sys.getsizeof()

由于如果存在嵌套对象,此方法在获取对象的实际大小时似乎不可靠,因此我使用Pypler来计算对象的大小,从而生成以下代码:

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

  • 组合的压缩对象如何可能小于两个单独的压缩值?可能是因为内存泄漏

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


Tags: 对象内存numpyformatsizenp数组compressed
1条回答
网友
1楼 · 发布于 2024-05-16 00:16:29

我不能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个字节的对象,我去掉了一组非数据(对象属性,比如大小),得到的对象稍微小一些

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

相关问题 更多 >