编辑:非常感谢所有的答案。以下是到目前为止应用优化后的结果:
- 切换到对字符进行排序和运行长度编码 - 新的 DB 大小 42M
- 删除布尔值上的索引 - 新数据库大小 33M
真正好的部分是这不需要对 iphone 代码进行任何更改
我有一个 iphone 应用程序,其中包含一个以 sqlite 格式(只读)保存的大字典。我正在寻找减少当前非常大的数据库文件大小的想法。
这是 sqlite DB 的条目数和结果大小:
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')
我的一个想法是更有效地对字母频率进行编码,例如将它们二进制编码为一个 blob(也许使用 RLE,因为有很多零?)。关于如何最好地实现这一目标的任何想法,或其他减少尺寸的想法?我正在用 ruby 构建数据库,并在目标 C 中通过电话阅读它。
还有什么方法可以获取数据库的统计信息,这样我就可以看到什么是使用最多的空间?