2009-05-05 7 views
1

Existe-t-il un moyen de pré-allouer ma base de données SQLite à une certaine taille? Actuellement, j'ajoute et supprime un certain nombre d'enregistrements et je voudrais éviter cela au moment de la création.SQLite - pré allocation de la taille de la base de données

+3

Pourquoi supposez-vous qu'il existe un surdébit que vous pouvez éviter? Cela compte-t-il même pour votre application si vous le pouvez? Je pense que vous essayez de faire une "optimisation prématurée" http://en.wikipedia.org/wiki/Optimization_(computer_science) et de Donald Knuth nous avons appris que "Nous devrions oublier les petites économies, disons environ 97% du temps: L'optimisation prématurée est la racine de tout Mal." – lothar

+1

Il y a un besoin légitime de faire cela qui n'est pas lié à l'efficacité. [Certains systèmes de fichiers] (http://blogs.technet.com/b/mikelag/archive/2011/02/09/how-fragmentation-on-incorrectly-formatted-ntfs-volumes-affects-exchange.aspx) ont une limite sur le nombre de fragments que le fichier peut avoir. Si vous connaissez la taille de votre base de données, vous pouvez éviter le problème en pré-allouant le fichier. –

Répondre

2

Il y a un hack - Insérez un tas de données dans la base de données jusqu'à ce que la taille de la base de données est ce que vous voulez, puis supprimez les données. Cela fonctionne parce que:

« Quand un objet (table, index, ou déclenchement) est passé de la base de données, il laisse derrière lui un espace vide Ce espace vide sera réutilisé la prochaine nouvelle information temps est. ajouté à la base de données Mais en attendant, le fichier de base de données peut être plus grand que strictement nécessaire. "

Naturellement, ce n'est pas la méthode la plus fiable. (De plus, vous devrez vous assurer que la fonction auto_vacuum est désactivée pour que cela fonctionne). Vous pouvez en apprendre plus ici - http://www.sqlite.org/lang_vacuum.html

+0

Comme je l'ai dit dans ma question, c'est ce que je fais actuellement. Mais merci pour l'indice auto_vacuum! – paul

+0

Content de vous aider. Une autre chose qui pourrait vous aider à améliorer légèrement les performances de la base de données SQLite est de s'assurer que vous défragmentez le fichier db (surtout si vous utilisez Windows). – Sam

5

Le meilleur moyen de le faire est avec la fonction zero_blob:

Exemple:

Y:>sqlite3 large.sqlite
version SQLite 3.7. 4
Entrez ".help" pour les instructions
Entrez les instructions SQL terminées par un ";"
sqlite>créer une grande table (a);
sqlite>insérer en grandes valeurs (zéroblob (1024 * 1024));
sqlite>drop table large;
sqlite>.q

Y:>dir large.sqlite
Volume dans le lecteur Y est personnelle
Volume Numéro de série est 365J-6110

Répertoire des Y: \

01/27/2011 12:10 PM 1 054 720 grand.sqlite


Note: Comme Kyle l'indique correctement dans son commentaire:

Il y a une limite à la taille de chaque BLOB, donc vous devrez peut-être insérer plusieurs blobs si vous prévoyez que votre base de données soit plus grande que ~ 1GB.

+0

Notez qu'il existe une [limite] (http://www.sqlite.org/limits.html) à la taille de chaque blob, donc vous devrez peut-être insérer plusieurs blobs si vous pensez que votre base de données est plus grande que ~ 1 Go –

+0

@Kyle: Bon point, j'ai mis à jour la réponse pour inclure cette information – Noah

Questions connexes