我正在尝试减少python dict的内存消耗,在我的情况下,它用作word-->document_id
“倒排索引”。每个word
都作为整数进行哈希处理,占用24个字节。
我想知道我是否可以将dict
的值中的每个元素和dict
中的每个键转换为比特数组。我注意到遇到的任何int
的最大值都小于2^22
,所以我可以只分配一个“22号”的位数组。
如何做到这一点?到目前为止,我已经看到了gmpy2
和bitarray
库,以及C ++ stdlib中的std::bitset
,我可以将它与Cython一起使用。我从post中读到bitarray
并不像gmpy
那么快。在gmpy
中,我不确定如何设置大小。最后,我想知道Python中gmpy
或bitarray
对象的内存开销是否值得,当我可以使用std::bitset
时,它可能使用最少的内存。
答案 0 :(得分:3)
>>> sys.getsizeof(1)
24
我的机器上只有一个整数 24字节。对于Python对象,对象开销会淹没这些小值的所有其他成本。即使你可以削减10位(你不能这样做;内存分配不能这样工作),它的花生与refcount,类型指针和dict条目本身(不包含在那里)相比数字),甚至在你得到实际数据之前。
bitarray
无济于事;它可能比int大。我不知道std::bitset
,因为我不确定Cython增加了什么开销,但是它会有比特数这样的开销。如果有的话,我希望Cython int能够发挥最佳效果,但它可能需要转换为常规的Python int才能进入dict。