Оптимизация производительности для реализации классов отношений в Ruby - PullRequest
0 голосов
/ 06 апреля 2011

Этот вопрос связан с моим предыдущим вопросом о производительности массивов и хэшей в Ruby .

Необходимые условия

Я знаю, что использование хэшей для хранения большого количества объектовприводит к значительному увеличению производительности из-за поиска O (1) .

Теперь давайте предположим, что у меня было два класса, а именно A и B, и они могут быть связаны друг с другом, но только если существует третий класс C (это своего рода класс отношений).Чтобы привести практический пример, допустим, у меня есть Document, Query и класс отношений Judgement (это из поиска информации, поэтому в основном решение говорит вам, является ли документ релевантным для запроса или нет).

enter image description here

(надеюсь, я правильно понял)

Проблема

В большинстве случаев вы хотите узнать, сколько Judgements существует комбинация Document и Query или, если они есть,

Чтобы выяснить последнее, я буду повторять каждый Jugdement ...

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

Теперь это снова возвращает нас к линейному поиску, который не так уж полезен.

Как его решить?

Я думал о способе двойного поиска.Хэши - если есть такая вещь - чтобы я мог просто посмотреть Judgements, используя Document и Query, которые у меня уже есть.

Или есть какой-либо другой способ быстро выяснить, является ли суждениесуществует для данной пары Document и Query?

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Что ж, если вам нужна производительность, вы всегда можете создать другую структуру данных для облегчения индексации - в вашем случае вы можете написать хеш, где ключи будут состоять из [document, query] пар, а массивы значений - judgments. В зависимости от архитектуры вашего приложения вы можете либо обновлять этот индекс при каждом изменении ваших объектов, либо создавать индексы с нуля всякий раз, когда вам нужно выполнить пакетный поиск.

Или, возможно, вам следует оставить это для базы данных, вместо этого, если, конечно, у вас вообще есть база данных.

1 голос
/ 06 апреля 2011

Это

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

можно записать как

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

Я согласен с Младеном Яблановичем в том, что это хороший шанс, что вы должны позволить вашей базе данных справиться с этим.В 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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...