编辑:Memory usage of a list of millions of strings in Python的答案也可以根据场景进行调整.


通过分析我的机器上的RAM使用情况(使用process manager),我注意到,像'abcd'这样的一组数百万字符串比一组数百万字节b'abcd'占用的内存要少得多(编辑:我错了,这是由于其他地方的错误).我想测试一下:

import random, string, sys
randomstring = lambda length: ''.join(random.choice(string.ascii_lowercase) for _ in range(length))
s1 = {randomstring(10) for i in range(100_000)}
s2 = {randomstring(50) for i in range(100_000)}
s3 = {randomstring(10).encode() for i in range(100_000)} 
s4 = {randomstring(50).encode() for i in range(100_000)} 
print(sys.getsizeof(s1), sys.getsizeof(s2), sys.getsizeof(s3), sys.getsizeof(s4))

但在这里,它总是给出相同的大小:4194528,而大小应该随系数x5而变化,对于字符串和字节的情况,可能会有所不同.

How to measure the memory size taken by these sets and all its elements?

注意:我知道在Python中查找 struct 占用的全部内存并不容易(另请参见In-memory size of a Python structure),因为我们需要考虑所有链接的元素.

TL;DR:Python中有没有工具可以自动测量集合的内存大小+内部引用(指针)占用的内存,哈希表存储桶,集合中承载的元素(这里是字符串...?简而言之:这组字符串所需的每个字节.有这样的记忆测量工具吗?

推荐答案

sys.getsizeof不度量完整目标数据 struct 的大小.它只测量set对象占用的内存,set对象包含references到字符串/字节的对象.references are not included in the returned memory consumption(即,它在目标数据 struct 的每个对象中执行not walk recursively).在64位平台上,一个引用通常需要8个字节,而CPython集合不像列表那样紧凑:它的实现方式类似于一个hash-table,有许多buckets个字节,而一些bucket是未使用的.事实上,这是该数据 struct 快速运行所必需的(一般来说,occupancy应该是50%-90%).此外,每个bucket包含一个哈希,通常需要8个字节.

绳子本身比桶占用的空间要大得多(至少在我的机器上是这样):

sys.getsizeof(randomstring(50))           # 99
sys.getsizeof(randomstring(50).encode())  # 83

在我的机器上,CPython字符串比字节大16字节.

Python相关问答推荐

七段显示不完整

保留包含pandas pandras中文本的列

将从Python接收的原始字节图像数据转换为C++ Qt QIcon以显示在QStandardProject中

无法导入已安装的模块

为什么基于条件的过滤会导致pandas中的空数据框架?

如何使用bs 4从元素中提取文本

是什么导致对Python脚本的jQuery Ajax调用引发500错误?

如何计算列表列行之间的公共元素

返回nxon矩阵的diag元素,而不使用for循环

Select 用a和i标签包裹的复选框?

查找两极rame中组之间的所有差异

有症状地 destruct 了Python中的regex?

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

优化pytorch函数以消除for循环

使用setuptools pyproject.toml和自定义目录树构建PyPi包

在pandas中使用group_by,但有条件

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

从Windows Python脚本在WSL上运行Linux应用程序

python—telegraph—bot send_voice发送空文件

找到相对于列表索引的当前最大值列表""