【问题标题】:How to store single byte of memory in Python?如何在 Python 中存储单字节内存?
【发布时间】: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 规则的 bytearrayarray.array 会更有效。
  • 在 Python 中,everything 是一个对象——这会带来一些开销。 @user2357112 使用数组的建议可能是你能做的最好的。
  • @ViFI:有时 Stackoverflow 用户对问题投反对票以获得他们的“批评”徽章(这需要您对某些问题投反对票)。我怀疑一个问题已经积累的反对票越多,就越有可能在该问题中添加另一个反对票……

标签: python python-2.7 memory-optimization


【解决方案1】:

在测量您的大小时,您没有注意从存储的数据大小中排除基础类开销。例如,下面显示 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

【讨论】:

  • 我观察到了这一点,但不知道如何避免这种开销。这可能是该问题的另一个标题,但恐怕它会吸引更多的反对票!
  • @ViFI 也许是一篇包含一些示例数据和问题的新帖子,“如何最紧凑地存储这些数据?”不过,您最终可能会为了解压数据所需的时间而牺牲紧凑性。
猜你喜欢
  • 1970-01-01
  • 2017-05-12
  • 2017-04-03
  • 2010-12-22
  • 2017-04-03
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多