gpt4 book ai didi

performance - 当两个输入集之一是正常集时,zinterstore 会更快/更慢吗?

转载 作者:IT王子 更新时间:2023-10-29 06:04:26 25 4
gpt4 key购买 nike

我知道我可以用普通集作为参数 ( Redis: How to intersect a "normal" set with a sorted set? ) 来做一个 zinterstore。这会影响性能吗?它会比仅使用 zset 更快/更慢吗?

最佳答案

根据sorted-set source code , ZINTERSTORE 会将集合视为得分为 1 的有序集合,函数名称为 zunionInterGenericCommand。

相交集将花费更多或更少的时间,具体取决于此步骤中使用的排序算法,例如:

   /* sort sets from the smallest to largest, this will improve our
* algorithm's performance */
qsort(src,setnum,sizeof(zsetopsrc),zuiCompareByCardinality);

Sets 和 Zsets 的存储方式也有差异,这将影响它们的读取方式。 Redis 将根据它们包含的元素数量来决定如何对(排序的)Set 进行编码。因此迭代它们需要不同的工作。

然而,出于任何实际目的,我认为最好的选择是使用 ZINTERSTORE,我将解释原因:我几乎看不出您在源代码中编写的任何东西会如何胜过Redis 在做你想做的路口时的性能。

如果您关心的是性能,那说明您在细节上做得太多了。您的重点应该放在操作的大 O 上,如命令 documentation 所示。 :

Time complexity: O(NK)+O(Mlog(M)) worst case with N being the smallest input sorted set, K being the number of input sorted sets and M being the number of elements in the resulting sorted set.

这告诉你的是:1-较小集合的大小和您计划相交的集合数量决定了第一部分。因此,如果您知道您将始终与两组相交,一组较小,另一组较大;那么你可以说第一部分是不变的。一个很好的例子是将商店中所有可用产品的集合(分数是库存中的数量)与用户购物车中的一组排序产品相交。

在这种情况下,您只有 2 套,而且您会知道其中一套非常小。

2-生成的排序集 M 的大小可能会导致很大的性能问题。但是这里有一个技巧:大的排序集合在太大时被编码为跳跃列表。一个小的排序集将存储为一个 zip 列表,这可能会在大的排序集中引起重要的命中。

但是,对于交集的情况,您知道结果集不能大于您提供的较小集。对于并集,结果集将包含所有集合中的所有元素;因此需要更多地关注较大集合的大小,而不是最小集合的大小。

总而言之,(排序的)集合的性能问题的答案是:它取决于集合的大小,而不是实际数据类型。考虑到生成的数据结构将是一个有序集合,而不管所有输入都是集合。因此,一个大的排序集将被存储(效率较低)作为一个跳跃列表。

事先了解您计划相交的集合数量(2、3,取决于用户输入?)和较小集合的大小(10?数百?数千?)会给您比内部数据类型更好的想法。两种类型的相交算法相同。

关于performance - 当两个输入集之一是正常集时,zinterstore 会更快/更慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39468717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com