布隆過濾器(BloomFilter)持久化


摘要

Bloomfilter運行在一台機器的內存上,不方便持久化(機器down掉就什么都沒啦),也不方便分布式程序的統一去重。我們可以將數據進行持久化,這樣就克服了down機的問題,常見的持久化方法包括持久化到本地磁盤或結合Redis進行持久化。本文主要介紹持久化到本地的操作。


關於BloomFilter的基本原理、jar包及入門Demo,請參考我的博客:布隆過濾器

數據持久化
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class Demo1 {
	
	public static void main(String[] args) throws FileNotFoundException {
		
		BloomFilter<Integer> filter = BloomFilter.create(
				  Funnels.integerFunnel(),
				  500,
				  0.01);
		
		//導入數據到filter
		for(int i = 0; i < 100; i++ )
		{
			filter.put(i);
		}
		
		//數據持久化到本地
		File f= new File("d:" + File.separator + "test2"); 
		OutputStream out = null;
		out = new FileOutputStream(f);    
		
		try {
			filter.writeTo(out);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//測試驗證
		for(int i = 0 ; i < 10; i++)
		{
			boolean result = filter.mightContain(i);
			
			if(result)
			{
				System.out.println("i = " + i + " " + result);
			}
		}
	}
}
讀取持久化數據
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class Demo2 {

	public static void main(String[] args) throws FileNotFoundException {
		
		BloomFilter<Integer> filter = BloomFilter.create(
				  Funnels.integerFunnel(),
				  500,
				  0.01);
		
		//將之前持久化的數據加載到Filter
		File f= new File("d:" + File.separator + "test2") ; 
		InputStream in = null;
		in = new FileInputStream(f); 
		try {
			filter = BloomFilter.readFrom(in,Funnels.integerFunnel());
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//測試驗證
		for(int i = 0 ; i < 10; i++)
		{
			boolean result = filter.mightContain(i);
			
			if(result)
			{
				System.out.println("i = " + i + " " + result);
			}
		}	
	}
}
Demo說明
Demo1:初始化filter對象,並導入測試數據,然后結合writeTo()方法將數據持久化到本地磁盤;
Demo1:初始化filter對象,讀取Demo1持久化到磁盤的數據,然后將數據導入到filter;
測試驗證:Demo1和Demo2都對創建后的filter進行了測試驗證。
更多參考

基於Redis的Bloomfilter去重(附代碼)

布隆過濾器

Guava學習筆記:Google Guava 類庫簡介

google/guava


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM