使用bitarray而不是int来节省dict的内存?

时间:2014-02-19 00:25:12

标签: python c++ cython bitset bitarray

我正在尝试减少python dict的内存消耗,在我的情况下,它用作word-->document_id“倒排索引”。每个word都作为整数进行哈希处理,占用24个字节。

我想知道我是否可以将dict的值中的每个元素和dict中的每个键转换为比特数组。我注意到遇到的任何int的最大值都小于2^22,所以我可以只分配一个“22号”的位数组。

如何做到这一点?到目前为止,我已经看到了gmpy2bitarray库,以及C ++ stdlib中的std::bitset,我可以将它与Cython一起使用。我从post中读到bitarray并不像gmpy那么快。在gmpy中,我不确定如何设置大小。最后,我想知道Python中gmpybitarray对象的内存开销是否值得,当我可以使用std::bitset时,它可能使用最少的内存。

1 个答案:

答案 0 :(得分:3)

>>> sys.getsizeof(1)
24

我的机器上只有一个整数 24字节。对于Python对象,对象开销会淹没这些小值的所有其他成本。即使你可以削减10位(你不能这样做;内存分配不能这样工作),它的花生与refcount,类型指针和dict条目本身(不包含在那里)相比数字),甚至在你得到实际数据之前。

bitarray无济于事;它可能比int大。我不知道std::bitset,因为我不确定Cython增加了什么开销,但是它会有比特数这样的开销。如果有的话,我希望Cython int能够发挥最佳效果,但它可能需要转换为常规的Python int才能进入dict。