代码之家  ›  专栏  ›  技术社区  ›  2371

使用太多内存的大量Python整数集

  •  4
  • 2371  · 技术社区  · 14 年前

    安装程序

    • Ubuntu x64版本

    我有一组唯一的整数,值在1到5000万之间。随机添加新整数,例如。 numberset.add(random.randint(1, 50000000))

    问题

    过了一段时间,我的低内存系统和我的经验集变得太大了 MemoryError

    问题

    如何在使用较少内存的情况下实现此目标?使用磁盘而不重新配置系统(如交换文件)最快的方法是什么?我应该使用像sqlite这样的数据库文件吗?有压缩内存中整数的库吗?

    6 回复  |  直到 14 年前
        1
  •  5
  •   John Machin Santi    14 年前

    您可以通过编写自己的代码来避免对第三方位数组模块的依赖性--所需的功能非常少:

    import array
    
    BITS_PER_ITEM = array.array('I').itemsize * 8
    
    def make_bit_array(num_bits, initially=0):
        num_items = (num_bits + BITS_PER_ITEM - 1) // BITS_PER_ITEM
        return array.array('I', [initially]) * num_items
    
    def set_bit(bit_array, offset):
        item_index = offset // BITS_PER_ITEM
        bit_index = offset % BITS_PER_ITEM
        bit_array[item_index] |= 1 << bit_index
    
    def clear_bit(bit_array, offset):
        item_index = offset // BITS_PER_ITEM
        bit_index = offset % BITS_PER_ITEM
        bit_array[item_index] &= ~(1 << bit_index)
    
    def get_bit(bit_array, offset):
        item_index = offset // BITS_PER_ITEM
        bit_index = offset % BITS_PER_ITEM
        return (bit_array[item_index] >> bit_index) & 1
    
        2
  •  5
  •   Community Neeleshkumar S    7 年前

    使用 bit-array

    房地产经纪人问题:

        3
  •  2
  •   Scott Griffiths    14 年前

    使用一个位数组作为每个整数的标志-所需的内存只有5000万位(大约6 MB)。有几个模块可以提供帮助。本例使用 bitstring bitarray :

    from bitstring import BitArray
    i = BitArray(50000000) # initialise 50 million zero bits
    for x in xrange(100):
        v = random.randint(1, 50000000)
        if not i[v]: # Test if it's already present
            i.set(1, v) # Set a single bit
    

        4
  •  1
  •   Abyx    14 年前

    阵列 模块。

        5
  •  0
  •   Michał Niklas    14 年前

    如果整数是唯一的,则使用位。示例:二进制 01011111

    它被描述在 one chapter of "Programming Pearls" by Jon Bentley

    似乎有 bitarray Emil提到的模块就是这样工作的。

        6
  •  0
  •   Alec Thomas    14 年前

    根据您的需求,您还可以考虑 bloom filter