1. Всем привет. Делаю pymorphy. Для его работы нужны словари, которые получаются путем конвертации исходных файлов в какой-нибудь key-value формат хранения на диске.

    В качестве рекомендованного хранилища для словарей выбрал, по глупости своей, BSDDB через модуль shelve. Это явилось причиной различных проблем при установке - где-то BSDDB не той версии и формат не совместим (debian), где-то его вообще нет (ActivePython 2.6 и др.).

    Не посоветуете какой-нибудь переносимый key-value формат хранения даннх? Чтоб человек мог просто скачать файл и начать использовать, без установки доп. пакетов и прочей мороки.

    Рассматривал варианты DumbDB из стандартной библиотеки, pickle по совместимому протоколу и вообще конвертацию словарей на конкретной машине в поддерживаемый формат через shelve (anydbm).

    С pickle все понятно, но он жрет огромную кучу памяти. Не хотелось бы рекомендовать такой плохой вариант. JSON примерно то же самое, т.к. все равно все данные в память грузить.

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

    Конвертация на каждой отдельной машине - это дополнительный шаг, который непонятно как согласуется с установкой через easy_install & pip (мне непонятно как). С одной стороны, в инсталлятор пихать тяжелый скрипт конвертации словарей не хочется (а он тяжелый). С другой, если не интегрировать в установщик, то непонятно как вообще запускать конвертацию в случае установки не из репозитория, а с pypi.

    Короче говоря, застрял. Буду рад любым мыслям по поводу.

  2. Иван Сагалаев

    06.01.2010

    2 ↑
    0 ↓

    SQLite?

  3. Sqlite почему-то выходило очень медленно, разница была в десятки+ раз (может даже сотни, не помню). Это был самый первый вариант в самой первой версии, я его выкинул и забыл даже.

    Хорошо, что напомнили. Может и стоит попробовать снова, вдруг тормоза были не из-за самого sqlite, а из-за каких-то особенностей реализации. Детально причины тормозов тогда не исследовал: перевел на shelve, сразу получил приемлемую скорость и успокоился.

  4. Питонячий модуль со словарем внутри?

    • переносим
    • редактируемый человеком в любом текстовом редакторе
    • легкость использования - подключение через __import__

    Или я не до конца понял задачу?

  5. Да, питонячий модуль со словарем внутри. Требуется переносимость файлов с данными и легкость установки модуля (хорошо, если вообще без установки). Или хотя бы без C-расширений, чтобы под win проблем не было.

    "Редактируемый человеком в любом текстовом редакторе" - не обязательно.

  6. Сейчас поддерживается tokyo cabinet, cdb, bsddb (+другие варианты из anydbm) и pickle. Первые 3 требуют, в общем случае, какой-то установки, не везде тривиальной.

  7. Это был не столько впрос сколько ответ — хранить словать в питонячьем словаре же:-)

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

  8. При импорте из pickle получаем как раз словарь в памяти. Этот вариант не очень устраивает, т.к. такой загруженный словарь занимает порядка 200М памяти. А словарь нужен весь.

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

  9. Sqlite подошел, спасибо. Результаты все равно кешируются в питоновском словаре, поэтому скорости хватает.

  10. Проходящий

    21.01.2010

    0 ↑
    0 ↓
    Обратите внимание на isolation_level в SQLite.
    Если хотите с ней быстро работать, то необходимо делать пачку запросов за раз.
    В противном случае - commit() после каждой операции изменения данных в БД убиваает скорость в ноль.
    П.С. В опере не вижу никаких кнопок отправки
  11. Буду иметь в виду. Хотя pymorphy из базы только читает, так что все ок.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.