问题:假设有500w条数据,数据是在2^32-1的范围内,数据重复,如何减少内存对数字进行统计呢?

  如果用字典来标记数字是否已经统计过来,数字做为key, value仅为0 or1,那么这样需要消耗

内存32*500w+32*500w,key和value占用内存相加。

  但如果我们用value的位来标记数据是否统计过,32bit可以存32个不同的数字,这样可以减少

为500w/32+500w/32.这就是bit bucket的魅力所在。

#!/usr/bin/env python
#-*- coding:utf-8 -*- SHIFT = 5 # 如果计算机为32位,SHIFT为5;如果计算机为64位,SHIFT为6
MASK = 0x1F # 如果计算机为32位,MASK为0x1F;如果计算机为64位,MASK为0x3F class BitBucket(object):
def __init__(self):
self._unique_key_count = 0 # 唯一的key有多少个
self._total_key_count = 0 # 加入的key有多少个
self._bit = {} def set(self, value):
"""return last bit"""
self._total_key_count += 1 if not self._has_key(value):
self._unique_key_count += 1
key = value >> SHIFT
self._bit[key] = self._bit.get(key, 0) | (1 << (value & MASK))
return 0
return 1 def exist(self, value):
if self._has_key(value):
return True
return False def clear(self, value):
if self._has_key(value):
self._unique_key_count -= 1
self._total_key_count -= 1 key = value >> SHIFT
self._bit[key] = self._bit[key] & (~(1 << (value & MASK)))
return True
return False def get_total_count(self):
return self._total_key_count def get_bit_count(self):
return self._unique_key_count def _has_key(self, value):
key = value >> SHIFT
return self._bit.get(key, 0) & (1 << (value & MASK)) if __name__ == '__main__':
bitBucket = BitBucket() for i in range(1, 27):
bitBucket.set(i) print bitBucket.get_total_count()
print bitBucket.get_bit_count() count = 0
for i in range(1, 30):
if bitBucket.exist(i):
count += 1 assert count == bitBucket.get_bit_count()

最新文章

  1. C++如何调用C#开发的dll
  2. Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法
  3. Liferay 6.2 改造系列之一:源码编译和服务启动
  4. [原创]CI持续集成系统环境---部署Gitlab环境完整记录
  5. 开源搜索引擎Iveely 0.7.0发布,不一样,那就让他不一样!
  6. 任务栏窗口和状态图标的闪动 z
  7. iOS开发UI篇—UITabBarController生命周期(使用storyoard搭建)
  8. Code Review中应该关注的点
  9. 【转】opencv-在图像上显示字符(不包括中文)
  10. libmad编译
  11. linux 安装与启动nginx
  12. 也许是目前实现最好的js模拟滚动插件
  13. Java 密码学算法
  14. Windows Internals 笔记——线程优先级
  15. 多线程深入:乐观锁与悲观锁以及乐观锁的一种实现方式-CAS(转)
  16. day19 python之re模块正则练习
  17. php源码笔记
  18. elasticsearch 5.1 别的机器无法访问9200端口
  19. js 函数中形参与实参的关系
  20. Excel长数字防止转换为科学计数法

热门文章

  1. Vue v-if 和 v-show
  2. 2Y - sort
  3. c10k C10M
  4. 文档根元素 &quot;mapper&quot; 必须匹配 DOCTYPE 根 &quot;configuration&quot;
  5. LaTeX数学公式大全
  6. imaplib.error: command: SEARCH =&gt; got more than 10000 bytes
  7. JSP属性的四种保存范围(page request session application)
  8. Linux产生序列数字
  9. Ubuntu 配置双网卡的问题
  10. Valid Mountain Array LT941