developing notes about sf search engine.

Monday, June 18, 2007

deduplicating - 排重

基于Bloom Filter 的排重

Bruno Martins 用java 实现了bloom filter,并且还移植了Maciej CeglowskiUsing Bloom Filters一文中给出的用于计算最优bit size 和 hash function number 的模型,但由于java.lang.Math.pow 方法存在bug,用移植后的方法往往会得到完全错误的结果。

于是想到用Maciej Ceglowski 提供的方法[1]预算出几种可能会用到的结果,以便于在程序中进行选择,但结果却又大失所望 :(

keyserror ratelowest bits sizebest hash functions
200000000.0001383459095.92670613
200000001e-05479331722.28796917
200000001e-06575105573.5447820
1000000001e-052396658611.4398517
1000000001e-062875527867.723920
1000000001e-073354894536.6684823


过于密集的hash functions 导致了大量的冲突,使得实际的error rate 与预期的相差很远!

无奈之下,最后还是选择了最原始的方法选择来可以接受的结果。最后得到下面的结果:

keyserror ratebits sizehash functions
<200000001000000003


注:
[1],请直接访问 Using Bloom Filters 以获得方法的最新版本。

基于Bekerley DB的排重

基于bekerley db 的排重结果:6340260 rows duplicated [total:13195827, deleted: 0, malformed:0]

基于bloom filter 的排重结果:6482366 rows duplicated [total:13195827, deleted: 0, malformed:0]

对13m的数据进行排重处理,实际重复的数据为6.34m,而bloom filter 过滤的结果是6.48m。

No comments:

About Me

lhelper 原名吕克让 工学学士 2002年毕业于北京工业大学计算机学院。 他最喜欢的花是文竹;最想做的是成为一名像 Richard Stallman 一样优秀的 Hacker。 最近他正在专心sf search 的升级与开发。