Целочисленная слишком большая ошибка при векторизации во время индексации whoosh

Я пытаюсь использовать Whoosh для индексации большого корпуса (примерно 25 миллионов академических рефератов + названия). Я пометил поле «резюме» с помощью vector=True, потому что мне нужно иметь возможность вычислять ключевые термины с высокой оценкой на основе абстрактов для подобия IR.

Однако после примерно 4 миллионов записей во время индексации произошел сбой со следующей ошибкой:

Traceback (most recent call last):
  File "...", line 256, in <module>
    ...
  File "/home/nlp/*/anaconda3/envs/riken/lib/python3.6/site-packages/whoosh/writing.py", line 771, in add_document
    perdocwriter.add_vector_items(fieldname, field, vitems)
  File "/home/nlp/*/anaconda3/envs/riken/lib/python3.6/site-packages/whoosh/codec/whoosh3.py", line 244, in add_vector_items
    self.add_column_value(vecfield, VECTOR_COLUMN, offset)
  File "/home/nlp/*/anaconda3/envs/riken/lib/python3.6/site-packages/whoosh/codec/base.py", line 821, in add_column_value
    self._get_column(fieldname).add(self._docnum, value)
  File "/home/nlp/*/anaconda3/envs/riken/lib/python3.6/site-packages/whoosh/columns.py", line 678, in add
    self._dbfile.write(self._pack(v))
struct.error: 'I' format requires 0 <= number <= 4294967295

Схема:

schema = Schema(title=TEXT(stored=False, phrase=False, field_boost=2.0, analyzer=my_analyzer, vector=True),
    abstract=TEXT(stored=False, phrase=False, analyzer=my_analyzer, vector=True),
    pmid=ID(stored=True),
    mesh_set=KEYWORD(stored=True, scorable=True),
    stored_title=STORED,
    stored_abstract=STORED)

Индексная папка в настоящее время весит около 45 ГБ. В чем именно здесь проблема? Whoosh просто не предназначен для передачи такого объема данных?


person Chum-Chum Scarecrows    schedule 26.12.2018    source источник
comment
Я бы разместил ваш вопрос в списке рассылки whoosh groups.google.com/forum/#! forum/whoosh, есть сообщение, что кто-то утверждает, что проиндексировал 13 миллионов документов, так что, может быть, есть обходной путь для 32-битной проблемы?   -  person Tomasz Swider    schedule 27.12.2018


Ответы (1)


Похоже, что поле, которое используется в качестве индекса документа, предназначено только для 32-битного целого числа без знака, что дает вам ограничение примерно в 4 миллиона документов.

Основано на этой проблеме в официальном репозиторий, простое изменение размера этого поля вызывает проблемы в другом месте, поэтому его нельзя решить тривиально.

Поскольку Whoosh активно не поддерживается, если вы не хотите копаться в источнике, вам, вероятно, следует изучить альтернативы.

person polm23    schedule 27.12.2018
comment
Можете ли вы придумать какие-либо альтернативы, которые все еще включают Whoosh? Можно ли использовать несколько индексов таким образом, чтобы имитировать один индекс или какой-либо другой трюк? - person Chum-Chum Scarecrows; 27.12.2018