热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

布隆过滤器的一个实战小例子

问题是这样的:现在服务器端有两个文件夹,里面的文件都是文件名为MD5后的字符串并且没有文件后缀。这两个文件夹里有少部分重复的文件(指文件名重复即认为重复)并且少量文件存,icod

问题是这样的:现在服务器端有两个文件夹,里面的文件都是文件名为MD5后的字符串并且没有文件后缀。这两个文件夹里有少部分重复的文件(指文件名重复即认为重复)并且少量文件存在后缀名(这个也是不需要的)

一共有200万到300万的文件,20多个GB。

如果考虑速度的话最好可以使用hash表,但是几百万的文件建立map要消耗很大的空间,这里牺牲一定的准确性采用布隆过滤器


#!/usr/bin/python
# -*- coding: utf-8 -*-
# author:shq
import BitVector
import os
class Hash(object): # 哈希函数用来将元素映射到位向量中
def __init__(self, bit_size, seed):
self.bit_size = bit_size
self.seed = seed
def hash(self, string):
result = 0
for i in xrange(len(string)):
result += self.seed * result + ord(string[i]) # 哈希值计算公式
# 把hash值映射到比特向量中,&位运算保证返回的整数小于bit_size-1(不等0时)
return (self.bit_size - 1) & result
class Bloom_Filter(object):
'''
这个布隆过滤器首先需要:
1、一个位向量
2、n个种子用来生成hash函数
3、n个hash函数(用来映射位置)
'''
def __init__(self):
self.BIT_SIZE = 1 <<21
self.bitset = BitVector.BitVector(size=self.BIT_SIZE)
self.seeds = [12, 23, 34, 45, 56, 67, 78, 89]
self.hash_fun_list = [Hash(self.BIT_SIZE, seed) for seed in self.seeds]
def insert(self, string):
for hash_fun in self.hash_fun_list:
i = hash_fun.hash(string)
self.bitset[i] = 1
def judge_exist(self, string):
if string is None:
return False
for hash_fun in self.hash_fun_list:
i = hash_fun.hash(string)
if self.bitset[i] == 0:
return False
return True
def get_file_name(file_dir_1, file_dir_2):
'''
:param file_dir_1: 存储进过滤器的文件夹
:param file_dir_2: 被查找的文件夹
:return:
'''
test_BF = Bloom_Filter()
# 文件夹1的文件映射进过滤器
for _, _, files in os.walk(file_dir_1):
for file in files:
if '.' in file: # 去除后缀
os.rename(file_dir_1 + '/' + file, file_dir_1 + '/' + file.split('.')[0])
file = file.split('.')[0]
test_BF.insert(file)
# 判断文件夹2的文件是存在于过滤器
for _, _, files in os.walk(file_dir_2):
for file in files:
if '.' in file: # 去除后缀
os.rename(file_dir_2 + '/' + file, file_dir_2 + '/' + file.split('.')[0])
file = file.split('.')[0]
if test_BF.judge_exist(file):
change_time_1 = os.stat(file_dir_1 + '/' + file).st_mtime
change_time_2 = os.stat(file_dir_2 + '/' + file).st_mtime
if change_time_1 > change_time_2:
print u'删除:',file_dir_2 + '/' + file
os.remove(file_dir_2 + '/' + file)
else:
print u'删除:', file_dir_1 + '/' + file
os.remove(file_dir_1 + '/' + file)



推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
author-avatar
曾家宏惠茹冠宇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有