Как уменьшить размер базы данных sqlite3 для iphone? - PullRequest
7 голосов
/ 30 декабря 2008

edit: большое спасибо за все ответы. Вот результаты после применения оптимизаций:

  • Переключение на сортировку символов и кодировку длины серии - новый размер БД 42M
  • Удаление индексов на логических значениях - новый размер БД 33M

Самое приятное то, что в коде iphone не требуется никаких изменений

У меня есть приложение для iphone с большим словарем в формате sqlite (только для чтения). Я ищу идеи по уменьшению размера файла БД, который в настоящее время очень большой.

Вот количество записей и итоговый размер базы данных sqlite:

franks-macbook:DictionaryMaker frank$ ls -lh dictionary.db
-rw-r--r--  1 frank  staff    59M  8 Oct 23:08 dictionary.db
franks-macbook:DictionaryMaker frank$ wc -l dictionary.txt
  453154 dictionary.txt

... в среднем около 135 байт на запись.

Вот моя схема БД:

create table words (word text primary key, sowpods boolean, twl boolean, signature text)
create index sowpods_idx on words(sowpods)
create index twl_idx on words(twl)
create index signature_idx on words(signature)

Вот некоторые примеры данных:

photoengrave|1|1|10002011000001210101010000
photoengraved|1|1|10012011000001210101010000
photoengraver|1|1|10002011000001210201010000
photoengravers|1|1|10002011000001210211010000
photoengraves|1|1|10002011000001210111010000
photoengraving|1|1|10001021100002210101010000

Последнее поле представляет буквенные частоты для извлечения анаграммы (каждая позиция находится в диапазоне 0..9). Два логических значения представляют под-словари.

Мне нужно выполнить такие запросы, как:

select signature from words where word = 'foo'
select word from words where signature = '10001021100002210101010000' order by word asc
select word from words where word like 'foo' order by word asc
select word from words where word = 'foo' and (sowpods='1' or twl='1')

У меня есть одна идея - более эффективно кодировать буквенные частоты, например, двоично закодируйте их как большой двоичный объект (возможно, с помощью RLE, поскольку существует много нулей?). Любые идеи о том, как лучше всего достичь этого, или другие идеи, чтобы уменьшить размер? Я собираю базу данных в ruby ​​и читаю ее по телефону в цели C.

Также есть ли способ получить статистику по БД, чтобы я мог видеть, что занимает больше места?

Ответы [ 11 ]

0 голосов
/ 31 декабря 2008

Правильно ли я считаю, что в вашей базе данных примерно 450 тыс. Слов?

Я не имею ни малейшего представления об iPhone, ни о серьезном отношении к sqlitem, но ... пока sqlite не позволяет сразу сохранить файл в формате gz (возможно, это уже происходит изнутри? Нет, не выглядит например, когда вы говорите, что она составляет около 135 байт на запись (даже с обоими индексами), я бы отошел от табличного подхода, сохранил его «вручную» в словарном подходе сжатия и построил бы остальное летать и в памяти. Это должно ОЧЕНЬ хорошо работать с вашим типом данных.

Подождите ... Вы используете эту подпись для полного поиска текста или опечатки? Полнотекстовый поиск на sqlite не устареет это поле?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...