【问题标题】:Redis: best way to count occurrence of item in setsRedis:计算集合中项目出现的最佳方法
【发布时间】:2016-03-14 21:59:30
【问题描述】:

我有一个列表,其中包含 40K 项可能存在于 3K 个集合中,我想计算每个项目存在多少个集合。

Python 中的简单算法并为简单起见省略了一些管道优化:

ids = [1,2,3,4,5]
set1 = (1,3)
set2 = (2,3)
set3 = (4,5)
sets = [set1, set2, set3]

ids_count = {}
for id in ids:
    ids_count[id] = sum([redis.sismember(id, set) for set in sets])

它将需要 120M 的 redis 调用或 3K 使用流水线,两者都非常慢。 在不改变数据存储方式的情况下有更好的方法(我已经有了 id 列表和 redis 上的集合列表)

【问题讨论】:

    标签: python redis


    【解决方案1】:

    我认为最有效的方法是下载整个内容(所有集合和所有 ID,正如您所描述的那样,无论如何您最终都会这样做),然后在内存中执行所有操作。此外,您的算法可能会在没有成员资格检查的情况下更有效地迭代集合,如下所示:

    # ...
    for set in sets:
        for id in set:
            if id not in ids_count:
                ids_count[id] = 0
            ids_count[id] += 1
    

    这是假设您的性能受网络限制。但是您必须对此进行基准测试才能确定。

    【讨论】:

    • 谢谢,这样做真的很快,从我实现的几个小时到这个实现的几秒钟
    • 很高兴我能帮上忙。 ;)
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2012-08-08
    • 2010-09-30
    • 2019-09-21
    • 2021-03-27
    • 2018-11-19
    • 2010-09-11
    相关资源
    最近更新 更多