1

如何在 Python 中分配/存储单个或几个字节(例如 2 或 4)字节的信息?

我不是在 Python 中寻找 malloc/new 的替代品,但可能是一些不需要大量内存的数据类型。

我尝试了以下方法,但如下所示,所有这些都占用了大量内存。

Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> i = 1 ; sys.getsizeof(i)
24
>>> i = None ; sys.getsizeof(i)
16
>>> i = 'c' ; sys.getsizeof(i)
38
>>> i = 'good' ; sys.getsizeof(i)
41
>>> i = bytearray(0) ; sys.getsizeof(i)
48
>>> i = bytearray(1) ; sys.getsizeof(i)
50
>>> from struct import *
>>> i = pack('h', 1) ; sys.getsizeof(i)
39
>>> i = array('l', [1]) ; sys.getsizeof(i)
64L

我喜欢 Python,并且正在编写一个应用程序来存储大约 100,000 条防火墙规则。如果我使用 Python 的常规数据类型(整数、字符串),每条规则将包含大约 500 个字节的信息。我想节省空间并避免切换到 C/C++,因为应用程序的其余大部分都在 Python (2.7) 中。

此外,我无法保留内存,因为我的应用程序几乎每 2 分钟检查一次规则的更新或修改。

我的想法是通过压缩信息来节省内存。例如,我不会将规则的“方向”存储为字符串或整数中的“输入”或“输出”或“输入输出”,而是使用 2 或 3 位来标记特定方向。有了这个,我假设我的一条规则信息可以保存到不到 10 个字节。为此,我想知道一种只存储 2/4 字节信息的方法。

感谢您的反馈/建议/指示。

4

1 回答 1

0

在测量您的大小时,您没有注意从存储的数据大小中排除基础类开销。例如,下面显示 bytearray 有大约 48 个字节的开销,但是每个添加的字节大约需要 1 个字节。我假设从 50 字节到 53 到 56 字节的跳跃表明内存访问优化。

>>> i = bytearray()
>>> sys.getsizeof(i)
48
>>> i = bytearray((1))
>>> sys.getsizeof(i)
50
>>> i = bytearray((1,2))
>>> sys.getsizeof(i)
53
>>> i = bytearray((1,2,3))
>>> sys.getsizeof(i)
53
>>> i = bytearray((1,2,3,4))
>>> sys.getsizeof(i)
53
>>> i = bytearray((1,2,3,4,5))
>>> sys.getsizeof(i)
56
于 2016-11-01T18:25:42.557 回答