За последние 24 часа нас посетили 32926 программистов и 1756 роботов. Сейчас ищут 840 программистов ...

Индексы

Тема в разделе "Прочее", создана пользователем Apple, 29 авг 2009.

  1. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Скажу в самом начале, что задача не относится ни к РНР, ни к MySQL.

    Предположим, что есть оцифрованная база данных словаря из нескольких миллионов слов, словосочетаний и словоформ без лексического анализа, т.е полные формы, инфинитивные формы глаголов (которые в процессе должны обрабатываться) и других частей речи.
    Над полной обработкой словарей работает лексикографическая группа, которая готовит примеры со словами, особенности использования и пр.
    В пример могу привести ABBYY Lingvo, в котором слова представлены карточками, и где каждое из слов имеет по несколько словарей, отображаемых на одной карточке.

    Задача состоит в правильной организации индекса словаря.
    Да, словарь будет всего один, в него входит несколько миллионов разных слов, которые имеют не просто прямой перевод, а ещё и склонение, спряжение, использование в наклонениях и другие вещи, но это уже при полном просмотре слова.

    Теперь, как будет правильней и рациональней организовать индекс словаря?
    Я пробовал сделать тестовый индекс, содержащий 1*10^6 строк разной длины и указатель на расположение (сдвиг) файла со словарем. Занял этот индекс 35 614 289 байт (35 Мб), и это только в случае миллиона слов, а ожидается, что будет их гораздо больше, приблизительно миллионов 6.
    Т.е предположить если, то размер будет около 210 Мб, тут уж речь не может идти ни о какой рациональности в плане загрузки индекса в память.

    Поэтому, вопрос:
    Как организовывать индексы?
    Как организовать их загрузку (целиком не катит, наверное) ?

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

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Нарисовал схемку, как я это представляю:

    [​IMG]
     
  3. kostyl

    kostyl Guest

    честно говоря, не понял ни конкретики исходных данных ни задачи
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Если речь идет о веб-сервисе, то какая проблема хранить несколько сотен мегабайт в памяти? Хайлоады иногда даже шаблоны хранят в памяти.
    Затраты ресурсов на работу с файловой системой и памятью несравнимы. При чтении файла информация грузиться в оперативку. Если она уже там, ничего никуда грузить не надо.
     
  5. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Задача: как грамотно организовать индекс?

    [vs]
    Нет, речь идет об десктопном проекте.
    Писаться будет он на "чистом" С++, без баз данных и прочего.
    Т.е поставляться будет программа, в которой есть навигация по словаю (наподобии Lingvo), сам словарь и индекс словаря.
    Т.е это всё, меня интересует конкретно организация индекса, как было бы грамотней распределить всё, чтобы не грузить все сразу слова в память?
    Или загружать какой-то сегмент по первой букве?
     
  6. kostyl

    kostyl Guest

    Apple
    Теперь понятно. Надо найти слово по индексу. То есть у тебя есть индекс, например, 11232323232 - позиция в файле- ты читаешь слово с этой позиции то метки конца слова?
     
  7. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    kostyl
    Всё верно.
    Вопрос только в том, что размер индекса может быть очень-очень большим, как с ним быть?
    Ведь не следует его загружать сразу целиом в память, надо как-то на кусочки разбивать, но как тогда будет определяться, какой индекс загрузить и какие временные задержки с выгрузкой + загрузкой другой части индекса?

    Или сделать ещё указатель индекса, который содержит метки букв, и при вводе определенной буквы читать этот блок?
     
  8. kostyl

    kostyl Guest

    Apple
    Тебе надо в памяти соответственно слову представить указатель на область в файле, где содержится куча слов типа?
    Ну попробуй хранить индекс в шестнадцатиричной системе. Так меньше занимать будет.
     
  9. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    на Си отлично впишется Firebird :)
    лучше него ты не напишешь все равно...
     
  10. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Что мешает использовать базу данных?
     
  11. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Apple, а что , если хранить индекс, который ссылается на массив слов , начинающийся с определенных букв? Не знаю, конечно, как там у тебя всё устроено и что требуется. Например:
    Код (Text):
    1. index('нав') {
    2.   Наверное
    3.   Навернуться
    4.   Наверняка
    5.   Навигация
    6.   Наводнение
    7. }
    а в них уже поиск перебором по небольшому массиву.
    Индексы будут маленькие и их будет намного меньше. Даже если ты возьмёшь первых 3 буквы — их будет в два-три раза меньше, я думаю. Плюс — очень короткие. И потому все индексы с лёгкостью войдут в память.

    Плюс под-массив должен быть упорядочен по алфавиту — тогда поиск можно сделать быстрый
     
  12. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Возможно автору пригодится почитать про Хеширующие таблицы (есть юнит от дельфи, говорят он нубо-легкий, значит разобраться в нем не сложно http://www.torry.ru/authorsmore.php?id=3771 )
     
  13. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    В реальном проекте я собирался использовать Firebird.

    Почему не предлагать БД?
    Потому что хочется разобраться. Да-да, именно не готовое решение использовать, а разобраться в реализации собственного более-менее приемлемого решения.
    Об использовании баз данных я и так с самого начала думал, а вот о том, как грамотно организовать быстрый и легкий индекс — это и есть задача.
    Кроме того, если решение задачи оказалось (окажется?) хорошим, именно его я и буду использовать =)

    Ага, сенкс, почитаю вечером.

    Вечером отвечу более подробно, сейчас времени нема.
     
  14. Amian

    Amian Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
  15. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    [​IMG]
    Только у меня появилась кнопка "забанить" под крекером?

    UPD: Теперь и под Apple появилась.
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632