我知道我可以用普通集作为参数 ( 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/
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac
我目前对后台队列不太满意。我正在尝试让Resque工作。我已经安装了redis和Resquegem。Redis正在运行。一个worker正在运行(rakeresque:workQUEUE=simple)。使用Web界面,我可以看到工作人员正在运行并等待工作。当我运行“rakeget_updates”时,作业已排队但失败了。我已经用defself.perform和defperform试过了。发条.raketask:get_updates=>:environmentdoResque.enqueue(GetUpdates)end类文件(app/workers/get_updates.rb)c
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa
原始问题Letd(n)bedefinedasthesumofproperdivisorsofn(numberslessthannwhichdivideevenlyinton).Ifd(a)=bandd(b)=a,whereab,thenaandbareanamicablepairandeachofaandbarecalledamicablenumbers.Forexample,theproperdivisorsof220are1,2,4,5,10,11,20,22,44,55and110;therefored(220)=284.Theproperdivisorsof284are1,2,
我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_