我有一个可以在3K套装上出现的40K物品的清单,我想要计算每件物品有多少套。
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上的集合列表)
答案 0 :(得分:1)
我认为最有效的方法是下载整个事物(所有集合和所有id,无论如何,你最终会做的,正如你所描述的那样),然后在内存中做所有事情。此外,如果没有成员资格检查,您的算法可能会更有效地迭代集合,如下所示:
# ...
for set in sets:
for id in set:
if id not in ids_count:
ids_count[id] = 0
ids_count[id] += 1
这假设您的表现受网络限制。但你必须对此进行基准测试才能确定。