Поддерживаемые типы хранилищ
============================

.. _supported-storages:

Общая информация
----------------

Алгоритмы в pymorphy устроены так, что требуют для работы данные в виде
словарей и массивов. Изначально pymorphy использовал структуры
``list`` и ``dict`` для хранения данных о словах и словообразовании.

Это работало быстро, но требовало большого количества оперативной памяти.
Поэтому сейчас для того, чтобы не загружать все словари сразу в память,
данные берутся из одной из key-value базы данных.

.. note::

    Интерфейс доступа к key-value хранилищам при этом остался тем же.
    Т.е. требование к хранилищу (обертке над хранилищем) - притворяться
    массивом или словарем, а именно - поддерживать ``[]`` и ``in``
    (``__getitem__``, ``__setitem__`` и ``__contains__``).

Словари лежат тут: https://bitbucket.org/kmike/pymorphy/downloads/ и
называются по формуле ``<язык>.<тип базы>-<формат данных>.zip``.

.. warning::

    Не скачивайте словари вида ``<язык>.<тип базы>.zip`` (например,
    ``ru.sqlite.zip``  - без 'json'), эти словари устаревшие: работают
    медленнее, в sqlite-словарях серьезная ошибка. В разделе для скачивания
    они пока оставлены в целях совместимости.

Типы хранилищ
-------------

SQLite
^^^^^^

Файлы со словарями имеют расширение "``.sqlite``". Набор словарей
для русского языка: `ru.sqlite-json.zip <https://bitbucket.org/kmike/pymorphy/downloads/ru.sqlite-json.zip>`_.
Пример подключения::

    m = get_morph('dicts/ru') # или так: get_morph('dicts/ru', 'sqlite')

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

Этот самый медленный вариант.


CDB
^^^

Файлы со словарями имеют расширение "``.cdb``". Набор словарей
для русского языка: `ru.cdb-json.zip <https://bitbucket.org/kmike/pymorphy/downloads/ru.cdb-json.zip>`_.
Пример подключения::

    m = get_morph('dicts/ru', 'cdb')

Это самый быстрый вариант (не считая варианта с полной загрузкой словарей
в память).

Установка::

    $ pip install python-cdb

Для установки потребуются установленные средства сборки (gcc, заголовочные
файлы питона).

Минус - лицензия GPL. А pymorphy - под лицензией MIT. И я вот не знаю, можно
ли вообще его использовать.

Официальный сайт: http://cr.yp.to/cdb.html

Официальный сайт библиотеки для python: http://pilcrow.madison.wi.us/

Автор - D. J. Bernstein.

Shelve
^^^^^^

Файлы со словарями имеют расширение "``.shelve``". Набор словарей
для русского языка: `ru.shelve-json.zip <https://bitbucket.org/kmike/pymorphy/downloads/ru.shelve-json.zip>`_.
Пример подключения::

    m = get_morph('dicts/ru', 'shelve')

Этот вариант потребляет меньше всего оперативной памяти при работе.

Shelve - это включенная в стандартную поставку библиотека, которая предоставляет
dict-like доступ к базам данных BSDDB, GDB, BDB и DumbDB.

Минусы - меньшая скорость работы, чем у альтернативных вариантов, и не всегда
переносимый формат словарей. Из-за этого нельзя быть уверенным, что скачанный
словарь заработает на конкретной машине.

Чтобы вариант гарантированно заработал, может потребоваться переконвертиртация
словаря для поддерживаемого формата данных на конкретной машине. Переконвертация
осуществляется с помощью скрипта encode_dicts.py, который есть в репозитории
(он не устанавливается через easy_install и pip).

Стоит учесть, что файл, размещенный для скачивания, создан, используя BSDDB 4.6.
Поэтому для работы нужен python с поддержкой bsddb 4.6. Если поддерживается
версия 4.5 (как в debian lenny), то словари можно перевести в более старый
формат::

    $ for f in *.shelve; do db4.6_dump $f | db4.5_load new_$f; done


Tokyo Cabinet
^^^^^^^^^^^^^

Файлы со словарями имеют расширение "``.tcb``" и "``.tch``" для
Btree+ и Hash-вариантов базы. Наборы словарей для русского языка:
``ru.tcb.zip`` и ``ru.tch.zip``.

.. note::

    Btree-вариант занимает меньше места, но работает чуть медленнее.

Пример подключения::

    m = get_morph('dicts/ru', 'tch')

Наследник BSDDB, BDB, GDBM, QDBM. Обеспечивает хорошую скорость работы и
небольшой размер словарей. Лицензия LGPL.

Требует установки tokyocabinet средствами ОС.

debian ::

    $ sudo aptitude install tokyocabinet-bin
    $ pip install pytc

macports ::

    $ sudo port install tokyocabinet
    $ pip install pytc

Официальный сайт: http://1978th.net/tokyocabinet/


Выбор хранилища
---------------

* Хочется быстро все попробовать, не заморачиваясь за установку: SQLite.
* Нужна большая скорость: CDB или Tokyo Cabinet.
* Нужна максимальная скорость: используем pickle (осторожно, потребуется
  200-300Мб оперативной памяти).
* Очень мало оперативной памяти: Shelve (BSDDB), отключаем кеширование.

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