布隆過濾器的乙個實戰小例子

2021-08-27 23:51:05 字數 2548 閱讀 4592

問題是這樣的:現在伺服器端有兩個資料夾,裡面的檔案都是檔名為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)

實現乙個布隆過濾器

布隆過濾器 bloom filter 是由布隆 burton howard bloom 提出的。它實際上是由乙個很長的二進位制向量和一系列隨機 對映函式 組成,布隆過濾器用於檢索乙個元素是否在乙個集合中。底層是利用雜湊表來實現的,它可以通過乙個hash函式將乙個元素對映成乙個位陣列 bit arra...

布隆過濾器的使用(實戰策略)

前言 布隆過濾器主要的使用用途就是用來判斷乙個元素是否在集合內存在的工具,現在企業業務處理的資料量越來越大,很多時候如果使用list等集合儲存的內容會顯得占用資源過於的龐大。使用方法 使用布隆過濾器網上有很多實現方法,自己寫起來也很麻煩,還好google提供了相應的包可以直接引用,使用起來十分的方便...

布隆過濾器速度 一文講透「布隆過濾器」

布隆過濾器本質上就是一種資料結構,比較巧妙的概率型資料結構 probabilistic data structure 特點是高效地插入和查詢,可以用來告訴你 某樣東西一定不存在或者可能存在 相比於傳統的 list set map 等資料結構,它更高效 占用空間更少,但是缺點是其返回的結果是概率性的,...