2012-04-10 4 views
0

Je dois stocker des millions d'entrées dans une base de données. Chaque entrée est identifiée par un ensemble d'identifiants entiers uniques. Par exemple, une valeur peut être identifiée par un ensemble de 10 identificateurs d'entiers, dont chacun est inférieur à 100 millions.Conditionnement de plusieurs entiers liés en un grand entier simple

Afin de réduire la taille de la base de données, j'ai pensé au codage suivant en utilisant une seule valeur entière de 32 bits.

 
Identifier 1: 0 - 100,000,000 
Identifier 2: 100,000,001 - 200,000,000 
. 
. 
. 
Identifier 10: 900,000,001 - 1,000,000,000 

J'utilise Java. Je peux écrire une méthode simple pour encoder/décoder. Le code utilisateur n'a pas besoin de savoir que je suis en train d'encoder/décoder pendant l'extraction/le stockage. Ce que je veux savoir est: quel est le moyen le plus efficace (le plus rapide) et recommandé pour implémenter un tel encodage/décodage. Une implémentation simple effectuera un grand nombre de multiplications/soustractions.

Est-il possible d'utiliser des décalages (ou des opérations au niveau du bit) et de choisir une taille de partition différente (la taille de chaque segment doit encore être proche de 100 millions)?

Je suis ouvert à toutes suggestions, idées, ou même un régime totalement différent. Je veux exploiter le fait que les identificateurs d'entiers sont limités pour réduire considérablement la taille de stockage sans compromettre sensiblement les performances. Edit: Je voulais juste ajouter que j'ai lu certaines des réponses postées sur ce forum. Une solution courante consistait à diviser les bits pour chaque identifiant. Si j'utilise 2 bits pour chaque identifiant pour un total de 10 identifiants, alors ma gamme d'identifiants devient sévèrement limitée.

+0

vous auriez besoin d'utiliser des puissances de 2 pour vos plages pour que le bit shift fonctionne. – MeBigFatGuy

+1

Pouvez-vous donner un exemple de la façon dont un tel entier codé ressemblerait (ainsi que comment vous décoder manuellement)? Veuillez utiliser des identifiants arbitraires (comme '144,560,000',' 200,0158,945', '399,888,777' etc.) pour votre exemple – Thomas

+1

Notez qu'avec un décalage, vous auriez 3 octets par identifiant seulement (si vous voulez mettre 10 identifiants dans 32 bits). Ainsi, chaque identifiant ne peut avoir que 8 valeurs différentes. – Thomas

Répondre

1

Il semble que vous souhaitiez regrouper plusieurs valeurs entières de 0 à 100 m dans un seul entier 32 bits? À moins d'omettre des informations importantes qui permettraient de stocker ces valeurs 0 ... 100m plus efficacement, il n'y a tout simplement pas moyen de le faire.

ceil (log2 (100m)) = 27bit, ce qui signifie que vous n'avez que 5 "bits de réserve".

+0

Merci. Je n'y avais pas réfléchi. –

1

Vous pouvez faire la taille de segmentation 27 bits qui vous donne des segments de 32 * 128 M. au lieu de 42 * 100 M

int value = 
int high = value >>> 27; 
int low = value & ((1L << 27) -1); 

Il ne vaut rien ce calcul est susceptible d'être trivial par rapport au coût de l'utilisation d'une base de données.

1

On ne sait pas ce que vous voulez vraiment faire, mais il semble comme vous voulez une valeur entière, chaque bit représentant ayant un attribut particulier, et l'application d'un bitmask. Un nombre entier de 32 bits peut enregistrer 32 attributs différents, 64 bits, 64 bits, etc. Pour en avoir plus, vous aurez besoin de plusieurs colonnes entières.

Si ce n'est pas le cas, je ne sais pas ce que vous entendez par "encoder".

+0

Vous avez raison. Je pense à d'autres façons de réduire la taille du fichier. –

Questions connexes