【问题标题】:Performance optimization for implementation of relationship classes in Ruby在 Ruby 中实现关系类的性能优化
【发布时间】:2011-04-06 08:10:54
【问题描述】:

这个和我的previous question on the performance of Arrays and Hashes in Ruby有关。

先决条件

我知道,由于 O(1) 查找,使用哈希存储大量对象会显着提高性能。

现在假设我有两个类,即AB,它们可以相互关联,但前提是存在第三类C(它是一种关系类)。举一个实际的例子,假设我有DocumentQuery和关系类Judgement(这是来自信息检索,所以基本上判断告诉你文档是否与查询相关)。

(我希望我做对了)

问题

在大多数情况下,您想知道DocumentQuery 的组合有多少个Judgements,或者如果有的话。

为了找出后者,我将遍历每个Jugdement ...

@judgements.each { |j| return true if j.document == document and j.query == query }

现在,这让我们再次回到线性搜索,这并没有多大帮助。

如何解决?

我正在考虑一种方法来拥有双哈希 - 如果有这样的事情 - 这样我就可以使用 DocumentQuery 查找 Judgements 我已经有了。

或者有没有其他方法可以快速找出给定的 Document 和 Query 对是否存在判断?

【问题讨论】:

    标签: ruby performance hash


    【解决方案1】:

    好吧,如果您需要性能,您总是可以创建另一个数据结构来促进索引 - 在您的情况下,您可以编写一个哈希,其中键是 [document, query] 对,值数组是 judgments。根据您应用的架构,您可以在每次对象更改时更新此索引,或者在需要执行一批查找时从头开始构建索引。

    或者,当然,如果您有数据库,您应该将其留给数据库进行查找。

    【讨论】:

    • 我根本没有数据库。不知道我可以只使用一个数组作为哈希键,这简化了一切。谢谢!
    【解决方案2】:

    这个

    @judgements.each { |j| return true if j.document == document and j.query == query }
    

    可以写成

    @judgements.any? { |j| j.document == document and j.query == query }
    

    我同意 Mladen Jabnović 的观点,因为这是您应该让您的数据库来处理这个问题的好机会。在 MongoDB 中会是这样的

    db = Mongo::Connection.new.db("mydb")
    judgements = db.collection("judgements")
    judgement = {:judgement_no=> "2011:73", :document => 4711, :query => 42}
    judgements.add(judgement)
    judgements.create_index([['document', Mongo::ASCENDING], ['query', Mongo::ASCENDING]])
    
    judgements.find({:document => 4711, :query => 42}).each { |jm| puts jm }
    

    【讨论】:

    • 哦,上面的行有效,它只是在一个函数内,所以当我找到东西时它会返回。我没有数据库层。
    • 啊,当然!我还是更喜欢any?。我改变了答案。
    • 甜,这就是我喜欢的 Ruby 方式 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2016-11-17
    相关资源
    最近更新 更多