这是我正在进行的设置:
[域:id]=>[关键字id,关键字id2,关键字id3….]
…
我想做的是为每个域,找到其他包含相似关键字的相似域。例如,我“度量”域1和域2之间的相似性的方法是通过将交集(域:1,域:2)除以并集(域:1,域:2)。
问题是我有大约500万个域名,每个域名平均有几百个关键词。在嵌套循环中对每个域与其他域进行比较,这样的相似性计算将花费我现在拥有的硬件数年的时间。我只测试了一个域名:
keys = redis.keys("domain:*");
foreach(keys as key){
long inter = sinterstore("inter_temp", "domain:1", key);
long union = sunionstore("union_temp", "domain:1", key);
float similarity = inter / union;
if(similarity > 0.1){
similar_domains.add(key);
}
}
…
^只为这一个域计算相似的域大约需要2分钟。为500万域名这么做可能要花上好几年的时间。
那我该怎么办?我可以将这个程序移到最昂贵的amazon ec2实例上,每周计算一个小时,然后将其发送回我的主机,但这是否有帮助,或者我的数据太多了?
最佳答案
而不是逐个比较每个域。难道你不能创建一批say 100并将该域中的所有密钥传递给redis,它将在那里为你进行并集/交集吗?
例如
SADD domain:1 a b c d e f
SADD domain:2 a c e
SADD domain:3 c e f h
SINTERSTORE destination domain:1 domain:2 domain:3
will result following keys [a, b ,c ,d ,e ,f, h] in destination set
and
SINTERSTORE destination domain:1 domain:2 domain:3
will result following keys [c ,e] in destination set