【发布时间】:2010-09-28 22:11:30
【问题描述】:
编辑:非常感谢所有的答案。以下是到目前为止应用优化后的结果:
- 切换到对字符进行排序和运行长度编码 - 新的 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 中通过电话阅读它。
还有什么方法可以获取数据库上的统计信息,以便我可以查看使用最多的空间?
【问题讨论】:
-
显而易见,但是自从创建/使用数据库以来,您是否对数据库进行了清理?
-
不,我没有,但是因为我没有删除任何东西(这是使用 ruby 脚本从头开始构建的),所以我认为没有必要。
-
为了澄清最后一条评论,我只是从一个文本文件(以显示的示例数据的格式)导入,使用:sqlite3 dictionary.db '.import dictionary.txt words
-
对,所以应该没有碎片,这意味着真空可能没有任何帮助。
-
对阅读本文的人的重要警告:如果您在 sqlite3 表上使用隐式 rowid,VACUUM 可以(并且将会!)删除您的一些行。
标签: iphone ruby sqlite compression