2013-07-26 2 views
0

Я строю алгоритм с инвертированным индексом. Я буду хранить индекс в виде хэш-таблицы в файле или базе данных. Обновление индекса включает 1. Загрузка его в память из файла или базы данных 2. Преобразование его в объект 3. Внесение изменений в объект 4. Преобразование объекта в строку 5. Сохранение его в файле или база данныхМетоды, чтобы избежать условий гонки в алгоритме с инвертированным индексом

Теперь есть несколько источников, которые подают данные в индекс. Если два или более источника пытаются одновременно подавать данные, есть неплохие шансы на участие в гоночных условиях.

Каковы наиболее известные методы, чтобы избежать этого?

ответ

1

Обычно вы не загружаете весь индекс в память, а затем записываете весь индекс обратно на диск позже.

Один из вариантов состоит в том, чтобы иметь индекс в основном на диске и просто изменять файл на диске напрямую. Чтобы избежать условий гонки, вы используете какую-то форму замка. Вы можете глобально заблокировать файл для записи, если обновления встречаются редко. Если вы хотите иметь более мелкозернистую блокировку, вам нужно больше принимать решения о структуре индекса на диске.

Другой вариант - иметь индекс в памяти и просто поддерживать «копию» на диске для целей восстановления. В этом случае каждый, обновляющий индекс, будет в конечном итоге манипулировать тем же, общим индексом в памяти, и доступ к нему будет защищен глобальными или мелкомасштабными блокировками уровня операционной системы.

+0

Спасибо за понимание. Будет ли хорошей идеей хранить индекс в базе данных в полностью нормализованной форме? Или это будет потреблять слишком много места и времени по сравнению с сырыми файлами? –

+0

См. [Этот вопрос] (http://stackoverflow.com/questions/2451919/what-is-the-best-way-to-build-inverted-index) –

Смежные вопросы