这是我正在进行的设置:
[域: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

10-05 23:12