redis - 相互比较1000万套

时间:2014-11-11 23:04:00

标签: redis nosql

这是我正在进行的设置:

[domain:id] => [keyword_id,keyword_id2,keyword_id3 ....] ....

我想要做的是为每个域,找到包含类似关键字的其他类似域。我测量的方式"域之间的相似性:1和域:2,例如,通过用union(域: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实例一小时来计算它,然后将它发送回我的主机,但是这甚至会有帮助,或者我只是拥有太多的数据?

1 个答案:

答案 0 :(得分:0)

而不是逐个比较每个域。你不能创建一批说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