【发布时间】:2017-03-14 22:31:06
【问题描述】:
如何在 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 字节信息的方法。
感谢您的反馈/建议/指点。
【问题讨论】:
-
只要确保我们解决了正确的问题,您的应用程序是否以必须同时存在内存中的 100k 条规则的方式制作?
-
即使您确实将它们全部存储为每个 500 字节,也只有 500 * 100000 / 1024^2 MB (47.7MB),这并不是很多。在某些情况下,Google Chrome 的一个标签页使用超过 100MB。
-
不要让每个规则都成为自己的对象。代表 array 规则的
bytearray或array.array会更有效。 -
在 Python 中,everything 是一个对象——这会带来一些开销。 @user2357112 使用数组的建议可能是你能做的最好的。
-
@ViFI:有时 Stackoverflow 用户对问题投反对票以获得他们的“批评”徽章(这需要您对某些问题投反对票)。我怀疑一个问题已经积累的反对票越多,就越有可能在该问题中添加另一个反对票……
标签: python python-2.7 memory-optimization