python - 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。
- 组合的压缩对象怎么可能小于两个单独的压缩值?它可能与内存泄漏有关吗?
提前感谢您阅读/回答我的问题,我很乐意在必要时提供更多信息
解决方案
我不是 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 个字节的对象,我摆脱了一组非数据(对象属性,例如大小),并且生成的对象略小。
无论如何,您的数据足够大,可以忽略这种差异。但是当使用很多小对象时,这种开销会消耗大量内存(就像我上面的例子一样)
推荐阅读
- python - 在我的 core/urls.py 文件中找不到 Django 页面 (404)。仅在重新排列 url 时有效
- azure - 无法将 Azure 搜索添加到 SQL 数据库
- c# - 如何使用 C sharp 在注册表编辑器中设置现有键
- javascript - ASP.NET Core MVC 控制器从 ajax 调用接收输入参数的 null
- javascript - “阅读更多”影响多个盒子 - 如何更改它?(jQuery/JS/CSS)
- r - 在 Fasterize 中选择多个属性?
- azure-active-directory - 如何使用 Microsoft Graph API 根据页码进行分页
- java - 如何扫描 postgreSQL 中的所有数据库?
- navigation - 如何在 Odoo 13 中隐藏“导航菜单”?
- javascript - 在 Material UI 中选择两个项目后自动取消选择“第一个选定项目”