新普金娱乐网址


香港电影经典男配角

地理面试小结之Elasticsearch篇

因Redis的Bloomfilter去重(附代码)

  • 十二月 15, 2018
  • 地理
  • 没有评论

作者简介:栗子,中国科大学研三学生,软件工程规范。有同一粒爱幻想爱做梦天马行空的少女心,也是平等员好登山爱冒险体力超人的女性丈夫。

专栏作者简介

打探“闪米特”是一个万分偶尔的机遇,一不好中科院山缘科考社团群里,有人分享了一个帖子。帖子上首先句话就是吸引了我,“这世上就来平等栽成功,就是会用爱的点子,度过一生”。

九茶

快速看了帖子内容,原来闪米特在展开世界首浅的单人沧澜江漂活动,他的爱妻羚羊,开车陆地从,水陆两地开展密西西比河探险的同。

Python工程师,近期居于马尼拉。Github著名开源爬虫QQSpiderSinaSpider笔者,平常会在CSDN上分享部分爬虫、数据等有益。爬了之网站有
QQ空间、果壳网天涯论坛、非死不可、Twitter、WooYun、Github、SearchCode、CSDN、知乎、Tmall、大众点评、图吧网、域名和IP数据、证券投资数、中国土地数据、某些政坛网站等。
除了爬虫领域外,还汇合享受部分Python小应用(例如Python+PhantomJS批量注册账号,登录等),接下当Python粤语社区还会享受部分Python在怪数额运算(ES、斯帕克(Spark))和数目挖掘地点的小说。

她们之故事,紧紧抓住了自己的心迹。对探险的崇拜情节,与朋友结伴浪迹天涯的幻想,让自家对本次活动出了明确的异。逐步领会后,才发现自己的想法来差不多幼稚。更对她们两口子的生死存亡相随,心生感动以及赞佩之情。

CSDN:http://blog.csdn.net/bone\_ace

新生而打各样信息论坛、网易与微信公众号,精通了闪米特其他的浮动探险活动,对客来了又周全的认和精晓,近年来爱惜黑龙江上浮动态化了每天的一定做作业。

Github:https://github.com/liuxingming

圈了闪米就的南渡河漂和密西西比河漂后,一贯怀念写点有关闪米特的事物,却以烦恼于未知底该怎么下笔。闪米特是我询问之最为富有多面性的总人口,仅从外的作品被认识的之人口,已经较我以现实生活中认识的有人,更加活泼,更立体,更充沛,更实际。

前言

他顶过特殊,让自家未能下笔,不晓得该盖何种模式从哪儿动手,才会显示更加真实的闪米特。困扰了少数龙,起头更一篇一篇地圈多瑙河上浮的篇章,在观察一半的时段猛然想,这自己吗干脆单开一个忠于的记录者,记录一个忠实的闪米特,记录他亚马逊河漂近三个月来所带吃我的反省以及影响。

“去又”是一般工作受到晤面经常利用的同样起技艺,在爬虫领域进一步常用,并且规模一般还比老。去再得考虑个别只点:去重的数据量、去还速度。为了保障比快之去重速度,一般选以内存中展开去重。

闪米特(Semit)

数据量不大时,可以从来放在内存里面举行去再,例如python能够使用set()举办去重。

中华大洋独木舟探险记录保持者

当失去再数要持久化时方可行使redis的set数据结构。

中原篇欠好纯人工无后帮助独木舟横渡莫桑比克海峡

当数据量再大一些常,可以就此不同之加密算法先以长字符串压缩成16/32/40只字符,再利用方面两栽艺术去还;

神州首次于独木舟横渡加利利海海峡

当数据量达到亿(甚至十亿、百亿)数量级时,内存有限,必须用“位”来去重,才可以满意要求。Bloomfilter就是将错过再对象映射到几乎单内存“位”,通过三只号之0/1值来判断一个靶是不是就有。

神州首不行独木舟环渡甘肃岛

可是Bloomfilter运行在同等贵机械的内存达到,不便宜持久化(机器down掉就什么还不曾啦),也未便于分布式爬虫的合去再。如果可以在Redis上申请内存举办Bloomfilter,以上两独问题就是仍是可以缓解了。

中国篇糟独木舟跨省海域穿越(海南费城—新余海港)

正文就凡是故Python,基于Redis实现Bloomfilter去重。下面先放代码,最终附上表达。

世界首不善泰国-高棉独木舟跨国海域穿越

代码

中华首涂鸦单人完漂闽江

# encoding=utf-8

世界首例单人全程漂流黄河探险者,正在申请吉海牙世界纪录

importredis

闪米特计划为此十年岁月(2013-2023年),完成独木舟环西印度洋之计划,探险航线途经高棉、泰王国、越南社会主义共和国、中国、日本、俄Rose、米利坚,仅凭人力纵穿七国,全程一万五千公里。近日早已成功3000公里,将来计划航线12000公里。

fromhashlibimportmd5

正开看闪米就的浮动随笔时,总觉着一个时刻跟风浪共舞、与危险为友的人,似乎理所应当是狂放不羁、豪气冲天的这种大侠英雄,甚至他的微信公众号像为自身倍感有些凶神恶好,令人口害怕。

classSimpleHash(object):

后来羁押了外的片摄像之后,发现他带在同等入眼镜斯斯文文,在记者发表会上,操在相同人数不正规的国语,会激动会紧张,会生涩地开玩笑,给人和善驯服、温文尔雅的发。而他笔下的仿可转犀利时而幽默,客观冷静的叙说着多瑙河沿岸的诚实故事,仅留白描,不开渲染,已足以振聋发聩,震撼人心。

def__init__(self,cap,seed):

扣押闪米只的漂流小说,会以为这人无所不知,无所不晓。他上通天文,观得了星座气象,下晓地理,能勘察地质料貌;陆地上可知翻山越岭,水中能搏击洋流;他博古,能耍鲜有文字记录之南陈乱伦史,细数毛南族俄国族的历史故事。

self.cap=cap

他通今,对华各类现状有独到见解,对是的弊端一针见血;武能掌控的了激流滚滚中的独木舟,领悟各个各类的射箭技术,登山、速降、曲棍球、溜冰,堪称十项全能运动选手;文能细数历朝历代衍生和变化变迁,熟读各国文史经典,尼采、雨果(Hugo)、奥修、王小波、龙应台信口拈来。

self.seed=seed

他会同鳄鱼周旋,与藏獒斗勇,他发生硬过口的忍耐力和恒心,,他发出五星级的独木舟漂流技术经历,独自一人制服曾吞噬了7各黄漂勇士的激流峡谷;他本着环境污染问题痛心疾首,为帮感染包虫病之藏民们奔走呼吁,他就是说一介布衣却心怀天下……

defhash(self,value):

外说:“我有只浪费的巴,就是盖浮动为媒,通过对黄河列寸水源河岸的洞察,写一管真正的密西西比河史”。

ret=0

外说:“白天,我在潮湿的水面及,一桨一桨划去未知之世界;上午,我当难得的郊外,一笔一笔状下所见所闻所想。试图用文字,让你们见,水上世界之绚烂与哀愁。“

foriinrange(len(value)):

于触及闪米但黑龙江上浮从前,对黑龙江的认与否特限于多瑙河凡是中国第二过程,含沙量极大,下游是地上河,是我们的大妈河。如今才知大家的二姨河正受到在如何的痛,我们刚刚怎样残忍的逐渐地摧毁着哺育了五千年中国文明的四姨河。

ret+=self.seed*ret+ord(value[i])

外说,旅程之外我们理应负责更多社会权利,探险带被他再也多的凡思考,而不刺激。闪米特同羚羊六只人,利用自己的积蓄,做到了成百上千特大型团队不可能成功的作业。

return(self.cap-1)&ret

这到今收,多瑙河上浮给到底带来了哪些影响?让我们询问及什么样不为人知的多瑙河故事呢?

classBloomFilter(object):

1、黑龙江源的口角炎小朋友;

def__init__(self,host=’localhost’,port=6379,db=0,blockNum=1,key=’bloomfilter’):

2、玉树大震后,灾后政策给当地人带来的熏陶;

“””

3、草地沙化造成的“生态移民”;

:param host: the host of Redis

4、在教育落后的甘肃高原地区,孩子等清晨10点大多还在教室外看;

:param port: the port of Redis

5、开展一序列关于包虫病的深切调查,这是吃世界忽略的17栽病症之一的寄生虫传染病,让藏区众四人家成绝户;

:param db: witch db in Redis

6、疯狂的冬虫夏草;

:param blockNum: one blockNum for about 90,000,000; if you have more
strings for filtering, increase it.

7、额尔齐斯河沿岸的污染问题到底出差不多严重,闪米特说,魔鬼来过,它还无走;

:param key: the key’s name in Redis

8、我们到底应该怎么着助人为乐;

“””

9、弱势群体与宗教顶牛。

self.server=redis.Redis(host=host,port=port,db=db)

……

self.bit_size=1<<31# Redis的String类型最特别容量也512M,现用256M

等等等等,还有不少于封杀的我们当下不能获悉的关于额尔齐斯河浮尸、天葬的工作,更多之饶算是闪米特夫妇为没法进一步研究的事实真相。通过闪米特的目,我们曾经领悟及这样多的,关于缅因河莫也人知的昆仑山真面目,目睹了大家的黄河母已没落,伤口正在流脓腐烂……

self.seeds=[5,7,11,13,31,37,61]

正要使网友的品,我们随后闪米特夫妇,一路历险,一路浅地询问多瑙河六头现况。历史是眼镜,而当时也是无力回天回避的客观存在,丑陋和光明都如去对。我们登时底言行,终究会变成映照未来的眼镜,而闪米特夫妇是急流勇进的磨镜人。

self.key=key

咱诚挚想这号水上徐霞客用他的夹桨成功划有真的沧澜江史,去写环大西洋底真实故事。而大家是不是合宜反思,应该走起来,不只是喝口号当看客,为营救我们的妈妈河,为咱自己,去举办点什么?

self.blockNum=blockNum

可望有同样天,我吧会透过大力,自豪地指向自己说:
“这大千世界就暴发一致种植成功,就是能用爱的法子,度过一生”。

self.hashfunc=[]

forseedinself.seeds:

self.hashfunc.append(SimpleHash(self.bit_size,seed))

defisContains(self,str_input):

ifnotstr_input:

returnFalse

m5=md5()

m5.update(str_input)

str_input=m5.hexdigest()

ret=True

name=self.key+str(int(str_input[0:2],16)%self.blockNum)

forfinself.hashfunc:

loc=f.hash(str_input)

ret=ret&self.server.getbit(name,loc)

returnret

definsert(self,str_input):

m5=md5()

m5.update(str_input)

str_input=m5.hexdigest()

name=self.key+str(int(str_input[0:2],16)%self.blockNum)

forfinself.hashfunc:

loc=f.hash(str_input)

self.server.setbit(name,loc,1)

if__name__==’__main__’:

“”” 首次于运行时会合显 not exists!,之后更运行会彰显 exists! “””

bf=BloomFilter()

ifbf.isContains(‘http://www.baidu.com'):\# 判断字符串是否有

print’exists!’

else:

print’not exists!’

bf.insert(‘http://www.baidu.com‘)

说明:

1、Bloomfilter算法怎么样选用各样去再,这么些百度上暴发成百上千讲。简单点说尽管是暴发几独seeds,现在提请一段落内存空间,一个seed可以跟字符串哈希映射到及时段内存上的一个员,几单号都也1哪怕意味着该字符串已经有。插入的下啊是,将投出之多少个各个还请否1。

2、需要提示一下之是Bloomfilter算法会有漏失概率,即无在的字符串有一定几率为误判为都存在。那么些概率的分寸和seeds的数、申请之内存大小、去重对象的数有关。下边有相同布置表,m表示内存大小(多少个位),n表示去再对象的数额,k表示seed的个数。例如我代码中申请了256M,

即1<<31(m=2^31,约21.5亿),seed设置了7独。看k=7那一列,当漏失率为8.56e-05时时,m/n值为23。所以n

21.5/23=0.93(亿),表示漏失概率也8.56e-05常,256M内存可满意0.93亿久字符串的去重。同理当漏失率为0.000112时常,256M内存可饱0.98亿长长的字符串的去重。

3、基于Redis的Bloomfilter去重,其实就是用了Redis的String数据结构,但Redis一个String最要命不得不512M,所以一旦去再的数据量大,需要提请六只去重块(代码中blockNum即表示去重块的数目)。

4、代码中使了MD5加密压缩,将字符串压缩到了32单字符(也可用hashlib.sha1()压缩成40只字符)。它来半点只成效,一是Bloomfilter对一个良充足之字符串哈希映射的早晚会错,平时误判为曾经在,压缩后就不再发此问题;二凡是削减后的字符为
0~f
共16负可能,我截取了眼前少独字符,再冲blockNum将字符串指定到不同的去重块实行去重。

总结

冲Redis的Bloomfilter去重,既用上了Bloomfilter的雅量去仍可以力,又就此上了Redis的但是持久化能力,基于Redis也有利分布式机器的去重。在动的进程被,要预算好待去重的数据量,则因下面的申,适当地调整seed的数据以及blockNum数量(seed越少自然去再速度越来越快,但漏失率越老)。

其余对因Scrapy+Redis框架的爬虫,我以Bloomfilter作了一部分优化,只待替换scrapy_redis模块即可使Bloomfilter去重,并且失去再队列和籽体系能够拆分到不同之机器及。

详情见《scrapy_redis去重新优化(已起7亿修数),附Demo福利》http://blog.csdn.net/bone\_ace/article/details/53099042

代码地址https://github.com/LiuXingMing/Scrapy\_Redis\_Bloomfilter

点击阅读全文进入作者博客主页

红小说

nginx日志:使用Python分析nginx日志

地理,⊙地理编码:怎么着用Python实现地理编码

爬虫代理:怎么样构建爬虫代理服务

生成器:关于生成器的这一个事

天猫女郎:一个批量抓取淘女郎写真图片的爬虫

在群众号底部回升上述重点词可直接打开相应著作

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图