メモリがボトルネックの場合、HashSetの代替クラス


レシピのキャプチャでは、キャプチャされたurlを除去する必要があり、最初に使用したHashSetは除去されますが、メモリの消費量が大きいです.そこでBloomFilter(goolge guava jarパッケージのツールクラス)を変更して再利用します.
次に、HashSetとBloomFilterのメモリ占有率と誤報率(集合中ではないのに既存として扱われる)の比較を行う.
メモリ使用量の比較:
6桁の数字からなる文字列をそれぞれ90万個、HashSetとBloomFilterに挿入します.
Set<String> set = new HashSet<>();
for(int i=10_0000; i<100_0000; i++)
        set.add(""+i);
//                                             
BloomFilter<CharSequence> bf = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 100_0000, 0.001);
for(int i=10_0000; i<100_0000; i++)
    bf.put(i+"");

1つのツールクラスで計算したメモリの使用量は、次のとおりです.
set memory:87588704(約87 M)bloom filter memory:1797624(約1 M)
さらに誤報率を比較します.
int falseHitCount = 0;
Set<String> set = new HashSet<>();
for(int i=10_0000; i<100_0000; i++){
    if(set.contains(i+"")) //  set           
        falseHitCount ++ ;
    set.add(i+"");
}
int falseHitCount = 0;
BloomFilter<CharSequence> bf = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 100_0000, 0.001);
for(int i=10_0000; i<100_0000; i++){
    if(bf.mightContain(i+"")) //   bloom filter           
        falseHitCount++;
    bf.put(i+"");
}

hashset flase hit count: 0bloom filter false hit count : 54
すなわち、HashSetは誤報が存在しないが、BloomFilterを構築する際の3番目のパラメータは誤報率が千分の一であることを指定し、実際の誤報率は54/90_である0000.
まとめ:
業務が個別の誤報(例えば個別メニューを見逃す)を許容できれば,HashSetの代わりにBloomFilterを用いることも考えられる.
補足:
オブジェクトのサイズを計算します.このブログを参照してください.
http://blog.csdn.net/xieyuooo/article/details/7068216
Guava maven座標:
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>15.0</version>
</dependency>