編集:すべての回答に感謝します。これまでの最適化を適用した後の結果は次のとおりです。
- 文字のソートとランレングス エンコーディングへの切り替え - 新しい DB サイズ 42M
- ブール値のインデックスを削除 - 新しい DB サイズ 33M
本当に素晴らしいのは、iPhone のコードを変更する必要がないことです。
sqlite 形式 (読み取り専用) で保持されている大きな辞書を持つ iPhone アプリケーションがあります。現在非常に大きい DB ファイルのサイズを小さくするためのアイデアを探しています。
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 バイト。
ここに私のDBスキーマがあります:
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 の範囲にあります)。2 つのブール値はサブディクショナリを表します。
次のようなクエリを実行する必要があります。
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')
私が持っている 1 つのアイデアは、文字の頻度をより効率的にエンコードすることです。たとえば、それらを blob としてバイナリ エンコードします (多くのゼロがあるため、おそらく RLE を使用しますか?)。これを達成するための最善の方法、またはサイズを縮小するための他のアイデアはありますか? 私はルビーでDBを構築し、目的のCで電話でそれを読んでいます.
また、DB の統計を取得して、最も多くのスペースを使用しているものを確認する方法はありますか?