8
votes

Quelle est la taille de mon bitset?

Je veux stocker System.CurrentTimeInmillis en mémoire avec un minimum d'espace possible. Parce que je dois stocker des millions d'entre eux en mémoire.

Je l'ai converti sur Bararrage qui m'a donné 41 bits

voici mon programme < / p> xxx

mais quand je l'exécute, je reçois xxx

question
- Pourquoi bitset.length () et bitset.size () diffère? Je suppose que longueur () est correct?
- J'utilise Mémoire-Meseur pour en savoir plus sur la taille de bitset , mais ça me dise 48 octets , pourquoi n'est-ce pas (41/8) octet ?

Je suis confus


2 commentaires

64 bits (probablement un long ) est le nombre de bits le bitset réellement utilisé pour contenir vos données. (Il ne peut pas allouer 41 bits.)


Les temps sont-ils connus pour être dans une certaine gamme d'une autre? Pourriez-vous jeter les octets élevés de chaque long sans perdre d'informations?


5 Réponses :


1
votes

Voir Java Doc de Bitset .

Chaque jeu de bits a une taille de courant, qui est le nombre de bits d'espace actuellement utilisé par le bit défini. Notez que la taille est liée à la La mise en œuvre d'un bit définie, il peut donc changer avec la mise en œuvre. le la longueur d'un jeu de bits est liée à la longueur logique d'un jeu de bits et est défini indépendamment de la mise en œuvre.


0 commentaires

2
votes

Votre code actuel ne peut pas stocker des millions de long ( System.CurrentTimeInmillis ). Vous pouvez utiliser TROVE TLONGHASHASHSET ou vous devez regarder Bitset Sparsse . Mais Bitset a Int Index, vous devez donc compresser depuis longtemps de courir en courant à int. Par exemple. bitsetIndex = (int) (actuelInmillis - initial). Il vous donne un intervalle 2 ^ 32 millisec (~ 50 jours) à partir de la première fois. XXX

EDIT

Un objet Bitset attribue plus de 100 octets sur le tas. Donc, vous devriez réutiliser un objet Bitset pour beaucoup de valeurs longues. Le moyen le plus simple est d'utiliser une valeur longue en tant qu'index à l'intérieur de Bitset et de la valeur définie comme true à cet indice. Mais il y a plusieurs problèmes (je les ai décrites ci-dessus):

  1. bitset a int index pas long
  2. java.util.bitset n'est pas efficace de la mémoire.

1 commentaires

ne peut pas être stocké pour des millions de longs , pouvez-vous expliquer pourquoi?



0
votes

Alors que BetaRride mentionné, la taille réelle que le bitset prend est spécifique à la mise en œuvre. Cela dit, dans les implémentations Oracle / OpenJDK (au moins, en 6, 7 et 8), l'élément de base de l'état est un LONG [] DES MOTS . Cela signifie que la taille est toujours un multiple de 64.

Quant aux 48 octets, je compte dans le code:

  • 16 octets pour l'objet Bitset lui-même
  • 20 octets pour l'objet long [] (16 pour l'objet, 4 pour la longueur)
  • 8 octets pour le contenu de la matrice (chaque élément est de 8 octets, mais vous en avez seulement un)
  • 4 octets pour int wordsinuse
  • 1 octets pour booleanzeSticky

    Ce qui donne 49 ans - pas loin des 48, vous voyez. Si ces Les en-têtes d'objet sont compressés , mais le rembourrage est également introduit, alors c'est probablement là où le 48 est venant de.


0 commentaires

5
votes

Pourquoi Bitset.length () et Bitset.Size () diffèrent? Je suppose que la longueur () est correcte? P>

Le Bitset. Taille () Code> est la taille de la structure de données interne qu'il utilise pour stocker des valeurs de bit. Depuis le Bitset Code> Utilise en interne A Long [] code> La taille est toujours un multiple de 64 bits. Par exemple. Si vous définissez le 64ème bit dans un Bitset code> Le Bitset code> doit augmenter la capacité du tableau long [] code> afin de stocker cette valeur, car Chaque long peut "seulement" stocker 64 bits. E.g. P> xxx pré>

bitset.length () code> retourne les bits occupés réels dans le Bitset code>. Donc si vous créez un nouveau bitset code> sa longueur est 0. Si vous définissez le 4ème bit, la longueur sera 5. La taille code> restera 64, car un seul long est nécessaire pour stocker 5 bits. P>

BitSet bitSet = new BitSet();
System.out.println(bitSet.length()); // 0
bitSet.set(4, true);
System.out.println(bitSet.size());  // 64
System.out.println(bitSet.length()); // 5


0 commentaires

4
votes

Tout d'abord, je souhaite conseiller le bon outil d'analyser les schémas de mise en page d'objet dans JVMS - Jol . Dans votre cas ( Java -Jar Jol-cli / cible / jol-cli.jar Internes Java.Util.Bitset CODE>) JOL Produit le résultat suivant:

Running 64-bit HotSpot VM.
Using compressed references with 3-bit shift.
Objects are 8 bytes aligned.
Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

java.util.BitSet@6b25f76bd object externals:
          ADDRESS       SIZE TYPE             PATH                           VALUE
        7ae321a48         24 java.util.BitSet                                (object)
        7ae321a60         24 [J               .words                         [0]


0 commentaires