Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby中关系类实现的性能优化_Ruby_Performance_Hash - Fatal编程技术网

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

Ruby中关系类实现的性能优化,ruby,performance,hash,Ruby,Performance,Hash,这一个与我的工作有关 先决条件 我知道使用哈希存储大量对象会因为O(1)查找而显著提高性能 现在让我们假设我有两个类,即A和B,它们可以相互关联,但前提是第三个类C存在(这是一种关系类)。举一个实际的例子,假设我有文档,查询和关系类判断(这来自信息检索,因此基本上判断告诉您文档是否与查询相关) (我希望我做对了) 问题 在大多数情况下,您希望了解对于文档和查询的组合有多少判断,或者是否有判断 为了找出后者,我将迭代每个Jugdement @judgements.each { |j| retur

这一个与我的工作有关

先决条件 我知道使用哈希存储大量对象会因为O(1)查找而显著提高性能

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

(我希望我做对了)

问题 在大多数情况下,您希望了解对于
文档
查询
的组合有多少
判断
,或者是否有判断

为了找出后者,我将迭代每个
Jugdement

@judgements.each { |j| return true if j.document == document and j.query == query }
现在,我们又回到了线性搜索,这并没有什么帮助

如何解决? 我在考虑一种使用双哈希的方法——如果有这种情况的话——这样我就可以使用
文档和
查询来查找
判断


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

如果您需要性能,您可以创建另一个数据结构以方便索引-在您的情况下,您可以编写一个散列,其中键是
[Document,Query]
对,和
判断的值数组
。根据应用程序的体系结构,您可以根据对象中的每次更改更新此索引,也可以在需要执行批量查找时从头构建索引


或者,如果你有一个数据库的话,你当然应该把它留给数据库来进行查找。

如果你需要性能,你可以创建另一个数据结构来方便索引——在你的情况下,你可以编写一个散列,其中键是
[document,query]
对,和
判断的值数组
。根据应用程序的体系结构,您可以根据对象中的每次更改更新此索引,也可以在需要执行批量查找时从头构建索引

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

@judgements.each { |j| return true if j.document == document and j.query == query }
可以写成

@judgements.any? { |j| j.document == document and j.query == query }
我同意Mladen Jablanović的观点,因为这是一个很好的机会,你应该让你的数据库来处理这个问题。在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 }
这个

可以写成

@judgements.any? { |j| j.document == document and j.query == query }
我同意Mladen Jablanović的观点,因为这是一个很好的机会,你应该让你的数据库来处理这个问题。在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 }

哦,上面的一行是有效的,它就在一个函数中,所以当我发现一些东西时它会返回。我没有数据库层。啊,当然!我还是喜欢
任何?
更好。我改变了答案。亲爱的,这是我喜欢的Ruby方式:)哦,上面的一行是有效的,它只是在一个函数中,所以当我发现一些东西时它会返回。我没有数据库层。啊,当然!我还是喜欢
任何?
更好。我改变了答案。亲爱的,这是我喜欢的Ruby方式:)我根本没有数据库。我不知道我可以用数组作为散列键,这简化了一切。谢谢我根本没有数据库。我不知道我可以用数组作为散列键,这简化了一切。谢谢