У меня есть около 10 000 слов, используемых в качестве набора инвертированных индексов примерно для 500 000 документов. Оба являются нормализован, поэтому индекс представляет собой отображение целых чисел (идентификатор слова) в набор целых чисел (идентификаторы документов, которые содержат это слово).
Мой прототип использует набор Python в качестве очевидного типа данных.
Когда я ищу документ, я нахожу список из N поисковых слов и их соответствующих N наборов. Я хочу вернуть набор документов на пересечении этих наборов N.
Метод «пересечения» Python реализован как попарное сокращение. Я думаю, что смогу добиться большего успеха с помощью параллельного поиска отсортированных наборов, если библиотека предлагает быстрый способ получить следующую запись после i .
Я искал что-то подобное для когда-то. Несколько лет назад я написал PyJudy , но я больше не поддерживаю его, и я знаю, сколько работы потребуется, чтобы довести его до стадии, когда я снова буду чувствовать себя с ним комфортно. Я бы предпочел использовать чей-то хорошо протестированный код, и мне нужен тот, который поддерживает быструю сериализацию / десериализацию.
Я не могу найти ни одного, или, по крайней мере, ни одного с привязками Python. Существует avltree , который делает то, что я хочу, но поскольку даже попарное слияние наборов занимает больше времени, чем я хочу, я подозреваю, что хочу, чтобы все мои операции выполнялись на C / C ++.
Вы знаете о каких-либо библиотеках дерева radix / patricia / crisbit, написанных как расширения C / C ++ для Python?
Если это не так, то какую библиотеку мне лучше всего обернуть? Сайт Judy Array не обновлялся в течение 6 лет, с 1.0.5, выпущенной в мае 2007 года. (Хотя он действительно строится чисто, поэтому, возможно, он просто работает.)
(Изменить: чтобы уточнить, что Я ищу через API, мне нужно что-то вроде:
def merge(document_sets):
probe_i = 0
probe_set = document_sets[probe_i]
document_id = GET_FIRST(probe_set)
while IS_VALID(document_id):
# See if the document is present in all sets
for i in range(1, len(document_sets)):
# dynamically adapt to favor the least matching set
target_i = (i + probe_i) % len(document_sets)
target = document_sets[target_i]
if document_id not in target_set:
probe_i = target_id
probe_set = document_sets[probe_i]
document_id = GET_NEXT(probe_set, document_id)
break
else:
yield document_id
Я ищу что-то, что реализует GET_NEXT () для возврата следующей записи, которая происходит после данной записи. Это соответствует Judy1N и аналогичные записи для других массивов Judy.
Этот алгоритм динамически адаптируется к данным и должен отдавать предпочтение наборам с низким числом совпадений. Для типа данных, с которым я работаю, это дало 5-10% увеличение производительности .) )