1
polythene 2013-04-11 15:25:34 +08:00 1
Bloom Filter
|
2
woshifyz 2013-04-11 15:28:16 +08:00 1
bloom filter ,你要判断不在集合内,所以不会错,而且是常数时间
|
3
richiefans 2013-04-11 15:31:34 +08:00
同求实例 这个算法还是没怎么理解
|
4
cloudzhou 2013-04-11 15:32:34 +08:00 2
我提供一个思路给你,在索引里面,定长数据查询效率要远远高于不定长数据,url是不定长数据,但是可以转变成为定长,如果散列足够随机,冲突不大的话,那么可以考虑,比如:
把url转换成为long值,hash(url) -> id long值的范围是 2^64,说实话,我不认为你能达到产生冲突的可能性 然后做非uniq索引,在每次查询结果列表里面做遍历,在冲突小的情况下,每次基本返回一条数据。 如果你的数据量很小,允许一定误差,那就根本不考虑冲突的情况。 这其实就是hash的基本思想。 |
5
sivacohan 2013-04-11 15:35:16 +08:00 1
bloom filter
SimHash |
6
littlekfc 2013-04-11 16:03:16 +08:00 1
用bloom filter有个问题,它是有误判的。比如新的一条url,在bloom filter里查得系统已经存在了。但这会有一定的概率是错误的。数据量还不大的话这个概率很小很小。但是随着记录越来越多,误判的概率会增大的。所以,如果业务要求不能漏url的话,bloom filter不适合,否则可以考虑。
|
7
lookhi 2013-04-11 16:05:37 +08:00
无论怎么做都行,最简单的MD5(URL),比对的时候简单的比对下就好了。
等你md5都不够用了的话,系统早就要升级了。 |
8
Muninn 2013-04-11 17:17:39 +08:00 via Android
你想变快 肯定要缩短url 想要缩短 肯定会损失信息
损失了信息肯定会碰撞 所以别纠结了 这个地方想完美是没辙的 和永动机一样做不到的 |
9
Angelkid 2013-04-11 17:34:01 +08:00
我刚好也在纠结这个问题
|
10
binux 2013-04-11 17:39:42 +08:00
上10亿了吗?没有?直接hash查库
|
11
Livid MOD 把 URL 的 sha256 放到 Redis 里查。
|
12
foxidea 2013-04-11 17:49:20 +08:00 1
告诉你怎么快速:
把 url 地址 反序一次, md5 一次,然后 取 md5 前三位 命名为表名 string tableName = "table_"+md5[0]+md5[1]+md5[2]; 然后再封装好算法,进行查、写入 |
13
amazingjxq 2013-04-11 18:26:47 +08:00
@foxidea 为什么要反序一次?这样做有什么好处吗
|
15
soho176 OP @woshifyz Bloom Filter在时间空间这两个因素之外又引入了另一个因素:错误率。在使用Bloom Filter判断一个元素是否属于某个集合时,会有一定的错误率。也就是说,有可能把不属于这个集合的元素误认为属于这个集合(False Positive),但不会把属于这个集合的元素误认为不属于这个集合(False Negative)。在增加了错误率这个因素之后,Bloom Filter通过允许少量的错误来节省大量的存储空间。
这样的结果就是有可能这个页面还没有爬过 却跳过了。。。 |
17
workaholic 2013-04-11 21:52:48 +08:00
Bloom Filter ++
|
18
csx162 2013-04-11 22:42:13 +08:00
先搞清楚慢的地方在哪里。。。
|
19
dingyaguang117 2013-04-12 00:06:46 +08:00
|
20
lddhbu 2013-04-12 18:54:13 +08:00
trie树可以吧
|
21
charnugagoo 2013-04-14 04:46:43 +08:00
很大的话,一般用bloomfilter, 如果再大或者是分布式爬虫的话就需要更高级的东西了。
PS:似乎还可以同时考虑做simhash,找出重复页面。 |
22
Zuckonit 2013-04-19 16:02:48 +08:00
hash啊。。。。。常量级
|
23
h4x3rotab 2013-04-19 16:40:24 +08:00
数量没有达到分布式的级别的话,哈希表就完全可以满足你的要求,任何一个实现良好的哈细表都能提供O(1)的查询和修改时间,也不会出错
|