Comment réduire la taille d'une base de données sqlite3 pour l'iphone?

edit: merci beaucoup pour toutes les réponses. Voici les résultats après l'application de la optimisations:

  • De commutation pour trier les caractères et la longueur de codage - DB taille 42M
  • La suppression des index sur les opérations booléennes - DB taille 33M

La très belle partie est, ce n'est pas nécessaire de toutes les modifications dans l'iphone code

J'ai une application iphone avec un gros dictionnaire tenue au format sqlite (lecture seule). Je suis à la recherche d'idées pour réduire la taille du fichier de base de données, qui est actuellement très grand.

Ici est le nombre d'entrées et la taille de la DB 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

...une moyenne d'environ 135 octets par entrée.

Voici ma DB schéma:

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)

Voici quelques exemples de données:

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

Le dernier champ représente la lettre de fréquences pour l'anagramme de recherche (chaque position est dans la plage 0..9). Les deux booléens représenter sous les dictionnaires.

J'ai besoin de faire des requêtes telles que:

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')

Une idée que j'ai est de coder la lettre de fréquences de manière plus efficace, par exemple binaire coder comme un blob (peut-être avec RLE comme il y a beaucoup de zéros?). Toutes les idées sur la meilleure façon de réaliser cela, ou d'autres idées pour réduire la taille? Je suis la construction de la DB en ruby, et la lecture sur le téléphone en objective C.

Aussi est-il possible d'obtenir des statistiques sur la DB de sorte que je peux voir ce qui est à l'aide de la plupart de l'espace?

Une lapalissade, mais avez-vous passez l'aspirateur sur la base de données puisqu'il a été créé / utilisé?
non, je n'ai pas, cependant, comme je n'ai jamais supprimé quoi que ce soit (ce qui est construit à partir de zéro en utilisant un script ruby) je ne pensais pas que c'était nécessaire.
afin de clarifier ce dernier commentaire, je viens d'importer à partir d'un fichier texte (au format de l'échantillon de données), en utilisant ceci: sqlite3 dictionnaire.db".l'importation dictionary.txt mots
À droite, il n'y a pas de fragmentation, ce qui signifie que le vide ne serait probablement pas vous être d'une quelconque aide.
Important mot d'avertissement pour les gens qui lisent ceci: si vous utilisez implicite rowids sur votre sqlite3 tables, VIDE peut (et va!) supprimer certains de vos lignes.

OriginalL'auteur frankodwyer | 2008-12-30