Je veux stocker Je l'ai converti sur voici mon programme < / p> mais quand je l'exécute, je reçois p> question strong> Je suis confus p> p> P> System.CurrentTimeInmillis code> en mémoire avec un minimum d'espace possible. Parce que je dois stocker des millions d'entre eux en mémoire.
Bararrage code> qui m'a donné
41 bits code> p>
- Pourquoi bitset.length () code> et
bitset.size () code> diffère? Je suppose que
longueur () code> est correct?
- J'utilise Mémoire-Meseur pour en savoir plus sur la taille de bitset code>, mais ça me dise
48 octets code>, pourquoi n'est-ce pas
(41/8) octet code>? p>
5 Réponses :
Voir Java Doc de Bitset . p>
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. P> blockQuote>
Votre code actuel ne peut pas stocker des millions de 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): P> long code> (
System.CurrentTimeInmillis code>). 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.
ne peut pas être stocké pour des millions de longs code>, pouvez-vous expliquer pourquoi?
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 [] CODE> DES MOTS
. Cela signifie que la taille est toujours un multiple de 64. P>
Quant aux 48 octets, je compte dans le code: p>
long [] code> (16 pour l'objet, 4 pour la longueur) li>
- 8 octets pour le contenu de la matrice (chaque élément est de 8 octets, mais vous en avez seulement un) li>
- 4 octets pour
int wordsinuse code> li>
- 1 octets pour
booleanzeSticky code> li>
ul>
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. p>
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 leBitset 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
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]
64 bits (probablement un
long code>) 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 code> sans perdre d'informations?