-
Всем привет. Делаю pymorphy. Для его работы нужны словари, которые получаются путем конвертации исходных файлов в какой-нибудь key-value формат хранения на диске.
В качестве рекомендованного хранилища для словарей выбрал, по глупости своей, BSDDB через модуль shelve. Это явилось причиной различных проблем при установке - где-то BSDDB не той версии и формат не совместим (debian), где-то его вообще нет (ActivePython 2.6 и др.).
Не посоветуете какой-нибудь переносимый key-value формат хранения даннх? Чтоб человек мог просто скачать файл и начать использовать, без установки доп. пакетов и прочей мороки.
Рассматривал варианты DumbDB из стандартной библиотеки, pickle по совместимому протоколу и вообще конвертацию словарей на конкретной машине в поддерживаемый формат через shelve (anydbm).
С pickle все понятно, но он жрет огромную кучу памяти. Не хотелось бы рекомендовать такой плохой вариант. JSON примерно то же самое, т.к. все равно все данные в память грузить.
DumbDB, похоже, тоже будет жрать кучу памяти, т.к. грузит индексы в память, а в словарях индексы не сильно меньше самих данных. Кроме того, медленная она, на каждый чих открывает и закрывает файл. Тоже не хотелось бы рекомендовать плохой вариант по умолчанию.
Конвертация на каждой отдельной машине - это дополнительный шаг, который непонятно как согласуется с установкой через easy_install & pip (мне непонятно как). С одной стороны, в инсталлятор пихать тяжелый скрипт конвертации словарей не хочется (а он тяжелый). С другой, если не интегрировать в установщик, то непонятно как вообще запускать конвертацию в случае установки не из репозитория, а с pypi.
Короче говоря, застрял. Буду рад любым мыслям по поводу.
-
SQLite?
-
Sqlite почему-то выходило очень медленно, разница была в десятки+ раз (может даже сотни, не помню). Это был самый первый вариант в самой первой версии, я его выкинул и забыл даже.
Хорошо, что напомнили. Может и стоит попробовать снова, вдруг тормоза были не из-за самого sqlite, а из-за каких-то особенностей реализации. Детально причины тормозов тогда не исследовал: перевел на shelve, сразу получил приемлемую скорость и успокоился.
-
Питонячий модуль со словарем внутри?
- переносим
- редактируемый человеком в любом текстовом редакторе
- легкость использования - подключение через
__import__
Или я не до конца понял задачу?
-
Да, питонячий модуль со словарем внутри. Требуется переносимость файлов с данными и легкость установки модуля (хорошо, если вообще без установки). Или хотя бы без C-расширений, чтобы под win проблем не было.
"Редактируемый человеком в любом текстовом редакторе" - не обязательно.
-
Сейчас поддерживается tokyo cabinet, cdb, bsddb (+другие варианты из anydbm) и pickle. Первые 3 требуют, в общем случае, какой-то установки, не везде тривиальной.
-
Это был не столько впрос сколько ответ — хранить словать в питонячьем словаре же:-)
Если не хочется грузить всё в память, то можно словарь раздробить на несколько модулей в пакете по какому-нибудь принципу. Потом в архив сложить и через zipimport подгружать.
-
При импорте из pickle получаем как раз словарь в памяти. Этот вариант не очень устраивает, т.к. такой загруженный словарь занимает порядка 200М памяти. А словарь нужен весь.
Есть вариант использовать какую-нибудь специально заточенную древовидную структуру данных вместо словаря, но это, во-первых, усложняет код, а во-вторых, у меня есть некоторые сомнения, что накладные расходы по хранению дерева не превысят выгоды от уменьшения дублирования данных.
-
Sqlite подошел, спасибо. Результаты все равно кешируются в питоновском словаре, поэтому скорости хватает.
-
Обратите внимание на isolation_level в SQLite.
Если хотите с ней быстро работать, то необходимо делать пачку запросов за раз.
В противном случае - commit() после каждой операции изменения данных в БД убиваает скорость в ноль.
П.С. В опере не вижу никаких кнопок отправки -
Буду иметь в виду. Хотя pymorphy из базы только читает, так что все ок.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.


