【问题标题】:Saving memory of dict by using bitarray instead of int?通过使用bitarray而不是int来节省dict的内存?
【发布时间】:2014-03-19 01:47:46
【问题描述】:

我正在尝试减少 python dict 的内存消耗,在我的情况下,它用作word-->document_id“倒排索引”。每个word 被散列为一个整数,占用24 个字节。

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

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

【问题讨论】:

    标签: python c++ cython bitset bitarray


    【解决方案1】:
    >>> sys.getsizeof(1)
    24
    

    那是 24 字节,只是一个整数,在我的机器上。对于 Python 对象,对象开销将覆盖如此小的值的所有其他成本。即使您可以减少 10 位(您不能;内存分配不能那样工作),与 refcount、类型指针和 dict 条目本身(不包括在 24数字),甚至在你得到实际数据之前。

    bitarray 无济于事;它可能比 int 大。我不知道std::bitset,因为我不确定 Cython 会增加多少开销,但它会产生诸如位数之类的开销。如果有的话,我希望 Cython int 效果最好,但它可能需要转换为常规 Python int 才能放入 dict 中。

    【讨论】:

    • 我可以使用std::unordered_map 来存储C 类型的unsigned int。但是您是说没有位数组就更好地实现它..?
    • @richizy:Bitarrays 无济于事。我认为unordered_map 可能是你最好的选择。
    • 好吧.. 我从来没有意识到对 Python 原语的内存引用会占用多少内存
    猜你喜欢
    • 2017-02-14
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多