【问题标题】:redis - compare 10 million sets with each otherredis - 相互比较1000万套
【发布时间】:2015-01-08 16:08:54
【问题描述】:

这是我正在进行的设置:

[域:id] => [keyword_id,keyword_id2,keyword_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 实例上一个小时来计算它,并将其发送回我的主机没有问题,但这是否有帮助,还是我只是有太多数据?

【问题讨论】:

    标签: redis nosql


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2015-08-08
      • 1970-01-01
      相关资源
      最近更新 更多