在Ruby中实现关系类的性能优化

时间:2011-04-06 08:10:55

标签: ruby performance hash

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

先决条件

我知道使用Hashes存储大量对象会因为 O(1)查找而导致显着的性能提升。

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

enter image description here

(我希望我做对了)

问题

在大多数情况下,您想知道JudgementsDocument的组合有多少Query,或者有Jugdement

为了找出后者,我将迭代每个@judgements.each { |j| return true if j.document == document and j.query == query } ...

Judgements

现在,这又让我们回到线性搜索,这没什么用处。

如何解决?

我正在考虑使用双重哈希的方法 - 如果有这样的事情 - 那么我可以使用我已经拥有的DocumentQuery来查找{{1}}。 / p>

或者有没有其他方法可以快速找出对于给定的一对文档和查询是否存在判断?

2 个答案:

答案 0 :(得分:3)

好吧,如果你需要性能,你总是可以创建另一个数据结构来方便索引 - 在你的情况下你可以写一个哈希,其中键是[document, query]对,值数组是judgments。根据应用程序的体系结构,您可以在对象发生每次更改时更新此索引,也可以在需要执行批量查找时从头开始构建索引。

或者,或许,您应该将它留在数据库中进行查找,当然,如果您有数据库的话。

答案 1 :(得分:1)

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

可以写成

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

我同意MladenJablanović的意见,你应该让你的数据库处理这个问题。在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 }