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.
Также есть ли способ получить статистику по БД, чтобы я мог видеть, что занимает больше места?