如何在Python中存储单字节内存?

时间:2016-11-01 18:04:58

标签: python python-2.7 memory-optimization

如何在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分钟检查一次更新或修改规则,因此无法保留内存。

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

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

1 个答案:

答案 0 :(得分: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