免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5337 | 回复: 5
打印 上一主题 下一主题

[算法] 求bitmap(位图)的压缩算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-10 12:43 |只看该作者 |倒序浏览
最近在用C做一个UID排重的程序,在尝试bitmap(位图)存储与比较。

先把源UID存到内存中,和需要对比的UID进行对比。

效率挺高的,可是内存利用率太低了。

比如申请了(unsigned int)(~0)字节的内存=4294967295*4*8bit,如果源uid有4亿个,利用率也只是接近1/42

请教各位大神有没有位图的压缩算法或者其他更好的处理方式?

先谢过啦

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2013-01-10 13:26 |只看该作者
把位图压缩一下那就是hashtable
std::unordered_map

论坛徽章:
0
3 [报告]
发表于 2013-01-11 09:15 |只看该作者
我觉得将bitmap做压缩不好,因为是正在使用过程中,每个记录查重都有解压,之后再压缩,不但浪费CPU,而且也不见得省内存。

哈希表也不好,因为哈希是做压缩映射,冲突不可避免,这样每条记录必须保存pk的数据项,而不只是存储记录有无的标记位,PK肯定比1个位标记空间大得多。

比较好的办法是将bitmap分页,根据内存大小选择部分在内存,部分在磁盘。方案的缺点是编程复杂,性能也不如驻留内存好,但是有很好的弹性。

论坛徽章:
0
4 [报告]
发表于 2013-01-11 10:35 |只看该作者
回复 3# fenghw8088

咱两想的差不多。压缩之后再做对比的时候会浪费时间,也不一定有效。

我在尝试在bitmap的基础上再做索引,进行中


   

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
5 [报告]
发表于 2013-01-11 10:54 |只看该作者
回复 3# fenghw8088


    推荐Judy Array,有做标记的版本Judy1,网址:http://judy.sourceforge.net/

这是一个数组,可以高效存储dword(4bit int)到指针的映射。其中Judy1是按bit存储的。即dword到1bit的映射。实质上就是一个按需扩展的bitmap。Judy Array的优势是内存使用率和效率都比较高。

论坛徽章:
0
6 [报告]
发表于 2013-01-13 14:53 |只看该作者
回复 5# starwing83


测试效果不错。
测试文件为有29904140行的uid文件,有重复

效果对比:
# time ./bitmap.test.out
real    0m8.002s
user    0m7.653s
sys     0m0.299s

# time ./judy.test.out
real    0m11.257s
user    0m11.063s
sys     0m0.174s

#ps aux
root     17370 56.6  0.4 138416 132836 pts/0   S+   14:44   0:10 ./judy.test.out
root     17579 53.8  0.8 530420 280572 pts/0   S+   14:45   0:09 ./bitmap.test.out

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP