在Python中节省内存的最佳布尔值存储方式

4

如何以最小的内存占用量将100万到45万个布尔值存储在类似于字典的集合中,这些值由长数字进行索引? True和Int每个条目都占用超过22个字节。 是否可能有更低的布尔值内存占用?


2
这将如何“类似于字典”?键是什么,值是什么? - Marcin
他可能意思是“类似于数组”。 - Aaron Digulla
1
如果它确实是一个字典,仅键本身将占用大量内存。 - John La Rooy
你能否在问题中澄清一下这个集合的具体情况?键值对中真的有2000亿个bool和同样数量的int吗?即使每个int只占用4个字节,那么这么多的int也会占用超过740GB的存储空间。而这么多的bools,即使每个bool只占用1位,也会占用另外23GB的存储空间... - Scott Griffiths
3个回答

4

谢谢。我正在受限的Win64服务器环境中操作,希望使用纯Python解决方案。 - Martlark
然后,采用Scott的解决方案。 - Senthess
Bitarray比使用字典慢4到5倍。这是不可接受的。 - Martlark

1

这两个主要模块是 bitarraybitstring(后者是我写的)。每个都可以满足您的需求,但各有优缺点:

bitarray

  • 作为 C 扩展编写,因此非常快速。
  • 仅适用于 Python 2。

bitstring

  • 纯 Python。
  • 适用于 Python 2.6+ 和 Python 3.x。
  • 具有更丰富的读取和解释数据方法。

因此,它取决于您需要对数据执行什么操作。如果只是存储和检索,则两者都可以,但对于性能关键的任务,最好使用 bitarray。请查看文档(bitstring, bitarray)以确定您更喜欢哪个。


我编写了一些快速测试来比较字典、列表、位串和数组模块的性能。虽然位串和数组在内存效率方面表现出色,但它们的速度却慢了数百到数千倍。使用字典可以在0.4秒内完成的任务,使用数组可能需要500秒才能完成。修改100000个字典项只需要0.05秒,而使用位串则需要4秒。因此由于性能问题而无法使用。抱歉。 - Martlark

0

你考虑过使用混合列表/位串吗?

使用列表存储位的一个维度。每个列表项将保存固定长度的位串。您可以使用列表将搜索集中到感兴趣的位串,然后使用位串查找/修改感兴趣的位。

该列表应允许最有效地检索位串,位串应允许您尽可能高效地打包所有数据,并且混合列表/位串应允许在速度(稍微较慢地访问列表中的位串)和存储(位打包数据加上列表开销)之间进行折衷。


我不再参与这个项目了。但那是一个有趣的想法。 - Martlark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接