2011-03-27 4 views
2

Je voudrais créer un fichier SQLITE qui comprend 5 000 000 valeurs tinyint (entre 0 et 256). Selon mes calculs, ce fichier devrait utiliser environ 5 [MB].SQLITE - un fichier avec 5 000 000 valeurs TINYINT?

Pourtant, j'obtiens un fichier de taille plus proche de 50 [MB].

Voici le code que j'utilise:

import sqlite3 
# Create and populate a database 
db = sqlite3.connect('/home/mine/temp.db') 
db.execute("CREATE TABLE IF NOT EXISTS test(id INT2)") 
for i in range(0, 5000000): 
    db.execute("INSERT INTO test(id) VALUES({0})".format(0)) 
db.commit() 
db.close() 

Toute idée comment optimiser les choses pour que cela prend beaucoup moins d'espace?

+0

Cela dépend du nombre de tables/index/beaucoup de choses. Avez-vous essayé de créer une base de données? – PostMan

+0

J'ai, et j'ai un énorme fichier. Peut-être que je ne suis pas compétent avec SQLITE. Aucune suggestion? (J'ai seulement besoin d'une table, pas d'INDICES du tout) – user3262424

+1

Quelle est la taille énorme? 6 Mo? 50 Mo? Cela pourrait valoir la peine de poster le code que vous avez utilisé pour générer la table. Ensuite, les gens peuvent faire des suggestions concrètes sur la façon de l'optimiser. –

Répondre

6

Il y a bien plus dans une base de données que de l'espace pour 5 millions de minuscules. SQLite a publié details of their file format. Il semble dire que vous aurez besoin d'au moins 9 octets par ligne.

SQLite utilise deux variantes distinctes de la structure B-Tree:

  • Le tableau B-Tree, qui utilise 64 bits des valeurs entières pour les clés. Dans un tableau B-Tree , un enregistrement de base de données associé (section 2.3.2) est stocké avec chaque entrée. Les structures du tableau B-arborescence sont décrites en détail à la section 2.3.4.
  • L'index B-Tree, qui utilise les enregistrements de base de données comme clés. Les structures de l'Index B-Tree sont décrites en détail dans la section 2.3.3 du document .
+0

Merci, cela explique tout. – user3262424

2

Avez-vous envisagé d'utiliser une table de valeurs/fréquences à deux colonnes? Cela rendrait les requêtes un peu plus compliquées (par exemple, vous auriez besoin de SUM(Value * Freq)/SUM(Freq) au lieu de AVG(Value)), mais vous n'auriez besoin que de 256 lignes au lieu de 5 millions.

+0

Je ne comprends pas comment cela résout le problème/comment cela m'évite d'avoir 5 millions de lignes. peux-tu expliquer? – user3262424

+0

Si, par exemple, vous avez 20000 occurrences du nombre 42, vous ne stockez pas 20000 lignes de (42). Vous stockez une rangée de (42, 20000). – dan04

+0

Je vois. La vérité est, j'ai besoin de savoir quel 'ID' résultats dans quel numéro. Donc, ce type de compression ne fonctionnera pas pour moi. – user3262424

Questions connexes